04. juni 2005 - 23:22Der er
32 kommentarer og 1 løsning
Ang. NullPointerException og ResultSet.
Jeg er studerende og eksperimenterer i java. Jeg har lavet et lille program i java, som skal skaffes adgang via en applet, men når jeg kaler ResultSet via den knap jeg har programmeret den til kommer den med en NullPointerException. Jeg kan sagtens få adgang til databasen ved create men ikke select. Her er min kildekode til min database klasse import java.util.*; import java.sql.*;
public class Database { private Connection forb; private Statement stmt; String a = ""; public void Database()
} catch (Exception a) { System.out.println("Kan ikke oprette data: "+a); } } // public void OpretData() throws SQLException // { // try // hvis tabellen ikke eksisterer opstår der en SQL-undtagelse // { // String time = tid.ur();
// int tem = temp.temperatur(); // stmt.executeUpdate("INSERT INTO INFO VALUES ('"+time+"',"+tem+")");
while (rs.next()) { int cpr = rs.getInt("CPRnr"); String pnavn = rs.getString("Navn"); int padresse = rs.getInt("Adresse"); int ppostnr = rs.getInt("Postnr"); String pby = rs.getString("By"); int ptlf = rs.getInt("TLFnr"); a = a+"\n"+cpr+"\n"+pnavn+"\n"+padresse+"\n"+ppostnr+"\n"+pby+"\n"+ptlf;
Alt der udkommenteret har jeg ikke brugt. Dvs. alt med //. det fungerer ikke i mit program. Jeg har oprettet en tabel som hedder patienten i toppen af programmet
} catch (Exception a) { System.out.println("Kan ikke oprette data: "+a); } } public String HentPat() throws SQLException {
ResultSet rs = stmt.executeQuery("select CPRnr, Navn, Adresse, Postnr, By, TLFnr from patienten"); Den linie herover kommer med NPE, når den kaldes fra min brugerflade while (rs.next()) { int cpr = rs.getInt("CPRnr"); String pnavn = rs.getString("Navn"); int padresse = rs.getInt("Adresse"); int ppostnr = rs.getInt("Postnr"); String pby = rs.getString("By"); int ptlf = rs.getInt("TLFnr"); a = a+"\n"+cpr+"\n"+pnavn+"\n"+padresse+"\n"+ppostnr+"\n"+pby+"\n"+ptlf;
ResultSet rs = stmt.executeQuery("select * from patienten"); Den linie herover kommer med NPE, når den kaldes fra min brugerflade while (rs.next()) { int cpr = rs.getInt("CPRnr"); String pnavn = rs.getString("Navn"); int padresse = rs.getInt("Adresse"); int ppostnr = rs.getInt("Postnr"); String pby = rs.getString("By"); int ptlf = rs.getInt("TLFnr"); x = x+"\n"+cpr+" "+pnavn+" "+padresse+" "+ppostnr+" "+pby+" "+ptlf; } return x; } } } Dette er den kode som ikke virker. Har skrevet under de 2 steder som fejlen opstår i.
og hele konstruktionen er farlig - en exception i Database constructor/metoden og så skal der ske en null pointer exception i HentPat fordi stmt er null
while (rs.next()) { int cpr = rs.getInt("CPRnr"); String pnavn = rs.getString("Navn"); int padresse = rs.getInt("Adresse"); int ppostnr = rs.getInt("Postnr"); String pby = rs.getString("by"); int ptlf = rs.getInt("TLFnr"); a = a+"\n"+cpr+"\n"+pnavn+"\n"+padresse+"\n"+ppostnr+"\n"+pby+"\n"+ptlf;
} return a; } public String HentFam() throws SQLException {
ResultSet rs = stmt.executeQuery("select * from familie");
while (rs.next()) { int cpr = rs.getInt("CPRnr"); String fnavn = rs.getString("Navn"); int fadresse = rs.getInt("Adresse"); int fpostnr = rs.getInt("Postnr"); String fby = rs.getString("by"); int ftlf = rs.getInt("TLFnr"); int fmob = rs.getInt("Mobiltlf"); String fnavn2 = rs.getString("Navn2"); int fadresse2 = rs.getInt("Adresse2"); int fpostnr2 = rs.getInt("Postnr2"); String fby2 = rs.getString("by2"); int ftlf2 = rs.getInt("TLFnr2"); int fmob2 = rs.getInt("Mobiltlf2"); b = b+"\n"+cpr+"\n"+fnavn+"\n"+fadresse+"\n"+fpostnr+"\n"+fby+"\n"+ftlf+"\n"+fmob+"\n"+fnavn2+"\n"+fadresse2+"\n"+fpostnr2+"\n"+fby2+"\n"+ftlf2+"\n"+fmob2; } return b; } public String HentDok() throws SQLException {
ResultSet rs = stmt.executeQuery("select * from doktor");
while (rs.next()) { int cpr = rs.getInt("CPRnr"); String dnavn = rs.getString("Navn"); int dadresse = rs.getInt("Adresse"); int dpostnr = rs.getInt("Postnr"); String dby = rs.getString("by"); int dtlf = rs.getInt("TLFnr"); c = c+"\n"+cpr+"\n"+dnavn+"\n"+dadresse+"\n"+dpostnr+"\n"+dby+"\n"+dtlf;
} return c; }
public String HentMed() throws SQLException {
ResultSet rs = stmt.executeQuery("select * from medicin");
java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Tabellen "patienten" findes allerede.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:288)
at Database.Database(Database.java:21)
at __SHELL2.run(__SHELL2.java:7)
at bluej.runtime.ExecServer.vmSuspend(ExecServer.java:186)
at bluej.runtime.ExecServer$3.run(ExecServer.java:673) Jeg kan selv se at tabellen patienten eksisterer i forvejen. Hvordan kommer jeg uden om den fejl.
Det virker hvis jeg kører den udenom min applet, men henter jeg den via min knap på appletten kommer den med nullpointer og det gør den ikke selvstændigt. Kan jeg prøve det samme med printstacktrace på min knap
Her kommer min kode til appletten. Det er knappen CPROK som ikke virker eller hvad der nu sker.
// Dette er et eksempel på simple brugerflader i awt...ktr 2003.08.18 import java.util.*; // Importerer en pakke med nanvnet utilities som gør os i stand til at anvende de foruddefinerede klasser import java.io.*; // Importerer en pakke med nanvnet input/output import java.applet.Applet; // Importerer en pakke med nanvnet applet import java.awt.*; // Importerer en pakke med nanvnet abstract windows toolkit import java.awt.event.*; // Importerer en pakke med nanvnet awt event. kan udføre handlinger import java.sql.*;
public class Brugerflade extends Applet implements ActionListener // Laver en udviddet applet og gør os i stand til at lytte { // efter en handling
Database data = new Database(); Andet and = new Andet(); Aftaler aft = new Aftaler(); Journal ajour = new Journal(); Dagplan dag = new Dagplan();
//*************************************************************************** public void init() // Her initialiseres brugerfladen når browseren kalder siden
{ setLayout(new FlowLayout()); // andre layouts kan indsættes data.Database(); // så laver vi nye komponent objekter : // Her defineres hver enkelt knap ud fra klassen Button og hvad der står i knappen på forhånd Bruger = new TextField("Brugernavn"); Bruger.setColumns(12); PWD = new TextField("Password"); PWD.setColumns(12); CPR = new TextField("Indtast CPR-nummer"); CPR.setColumns(12); KnapOKCPR = new Button("CPR OK"); KnapDagplan = new Button("Dagens gøremål"); KnapFamilie = new Button("Pårørende"); KnapAftaler = new Button("Aftaler"); KnapMedicin = new Button("Medicin Cardex"); KnapJournal = new Button("Patient-Journal"); KnapAndet = new Button("andet"); KnapOK = new Button("OK"); KnapDoktor = new Button("Egen læge"); KnapDagplan = new Button("Opd. Dagplan"); KnapJournal = new Button("Opd. Journal"); KnapAftaler = new Button("Opd. Andet"); KnapAndet = new Button("OK"); SkriveFlade = new TextArea(25,50); // Her defineres et vindue til uskrift og størrelsen ud fra klassen Textarea
Forfatter = new Label("Flemming Steenstrup Jakobsen"); // Her defineres en label ud fra klassen Label
Herunder den Exception som opstår. Første del er når brugerfladen init. så skal forbindelsen til databsen oprettes. java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPackageAccess(Unknown Source) at sun.applet.AppletSecurity.checkPackageAccess(Unknown Source) at sun.applet.AppletClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at Database.Database(Database.java:16) at Brugerflade.init(Brugerflade.java:32) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Kan ikke oprette data: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)
Her er anden del når jeg trykker på knappen, men den virker nok, bare den sikkerhed bliver fjernet eller hvad det nu er. java.lang.NullPointerException at Database.HentPat(Database.java:58) at Brugerflade.actionPerformed(Brugerflade.java:119) at java.awt.Button.processActionEvent(Unknown Source) at java.awt.Button.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Indtastningsfejl... Prøv igen java.lang.NullPointerException
Håber stadig I vil hjælpe. Jeg skal aflevere mit program imorgen
Du kan ikke fra en applet til en Access database. Du kunne gøre det med MSSql eller MySql. Tænk over den generelle model: en applet hentes fra en webserver, på webserveren ligger Access-filen, den kan ganske enkelt ikke tilgås fra en fremmed klient via TCP/IP.
Så i stedet for at rette de mange fejl du har, så: Hvad er det du vil?
brugen af by er ændret fra By til by. Det overflødige void er fjernet nu. Det med DSN er det ikke DNS du tænker på. Jeg har lavet en database på samme måde før, så det skal ikke være noget problem. Jeg har brugt MS ACCESS på det samme netværk uden om nettet. Det skal bare være sådan at det virker i første omgang. Husk jeg er ikke så erfaren må man sige. Jeg har måtte fjerne kaldet på data.Database() i appletten da den ikke peger på noget mere så nu ser billedet anderledes ud. Nu er der mere galt.
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPackageAccess(Unknown Source) at sun.applet.AppletSecurity.checkPackageAccess(Unknown Source) at sun.applet.AppletClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at Database.<init>(Database.java:16) at Brugerflade.<init>(Brugerflade.java:18) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at sun.applet.AppletPanel.createApplet(Unknown Source) at sun.plugin.AppletViewer.createApplet(Unknown Source) at sun.applet.AppletPanel.runLoader(Unknown Source) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Kan ikke oprette data: java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc) java.lang.NullPointerException at Database.HentPat(Database.java:58) at Brugerflade.actionPerformed(Brugerflade.java:119) at java.awt.Button.processActionEvent(Unknown Source) at java.awt.Button.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Indtastningsfejl... Prøv igen java.lang.NullPointerException
OK men hvordan skal det så laves. Jeg skal have lavet nogle knapper, tekstfelter og en skriveflade. Jeg er ny i det her og skal aflevere min eksamensopgave imorgen. Hvis det ikke er for svært er det OK
Men skal det være en applet? Der må stå noget i din opgave om hvordan det forventes den løses. Hvis opgaven siger applet, skal du selvfølgelig forholde dig til det. Men hvis den siger det "bare" skal være et java-program, skal du nøjes med det - så burde det være nemmere.
PS: Du skal ikke regne med vi (hvis jeg må tillade mig at udtale mig på andres vegne) løser din eksamensopgave for dig. Men måske du kan få hjælp når du går i stå.
ja det forstår jeg. men det er jo også derfor at jeg netop spørger, da jeg er gået i stå her. Og så det at den pludselig kommer med en fejl jeg ikke har set før. Det virker på mig som om, at der er sket en ændring i java efter opdateringen da det har virket før med et andet program
jeg har afleveret min opgave. Den blev fin. Nu sidder jeg og spekulerer på, hvordan jeg kan udbygge den. Kan man foretage en søgning ud fra et felt i databasen f.eks et cprnummer så jeg får personens opllysninger udskrevet. Altså skrive cprnummer i et tekstfelt og eksekvere via en knap.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.