nullPointerException w aplecie korzystającym z JDBC

0

Witam,

Stworzyłem aplet korzystający z bazy MySQL. W applet viewerze pod netbeansem działa super, natomiast otwarty przez przeglądarkę rysuje ładnie GUI, ale kiedy karzę mu cokolwiek pobrać z bazy, konsola wysypuje nullPointerException. Czym to jest spowodowane?

0

Napisz całego stacka jakiego ci ten wyjątek wywala.

aplet podpisany?

0

Aplet nie był podpisany, wydawało mi się że podpisywanie jest wymagane tylko gdy trzeba operować na dysku. ale widać byłem w błędzie.
Podpisałem i przebudowałem projekt, teraz pojawia się Security Exception:

ava.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/E:/Dokumenty/java/pojects/aplet_test/dist/
	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(Unknown Source)
	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1500(Unknown Source)
	at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.checkResource(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Exception: java.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/E:/Dokumenty/java/pojects/aplet_test/dist/
 
0

Przecież to jest bez sensu, żeby aplet odwoływał się do pliku na Twoim dysku.

0

tutaj chodziło najpewniej o plik *.jar z driverem do MySQL, z tym już się uporałem. Wrzucam stacktrace'a.

 java.lang.NullPointerException
	at tanks.ClassMySQL.executeQuery(ClassMySQL.java:70)
	at tanks.TanksJApplet.jButton1ActionPerformed(TanksJApplet.java:431)
	at tanks.TanksJApplet.access$500(TanksJApplet.java:28)
	at tanks.TanksJApplet$8.actionPerformed(TanksJApplet.java:175)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(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)
0

I teraz sprawdzasz: 70 linijka ClassMySQL.java, jakie obiekty tam używasz, czy jest możliwość że któryś z nich nie został utworzony. Jak tam nie tworzysz, to idziesz w górę.

0
public ArrayList[] executeQuery(String Query,int colCount)throws SQLException {
         try {
        ArrayList[] columns=new ArrayList[colCount];
        for ( int i=0;i<colCount;i++)
            columns[i]=new ArrayList();
        Class.forName(driverString);
        con = DriverManager.getConnection(connString,usrName,pswd);
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(Query);

        while(rs.next()){
            
            for ( int j=1;j<=colCount;j++)
                columns[j-1].add(rs.getString(j));



        }return columns;
        }
         catch(Exception ex){
             System.out.println("exception in executeQuery: "+ex.toString());
             return null;
        }
         finally {
             con.close();
        }
    } 

70 linijką jest finally. Obiekt connection faktycznie mógł nie zostać utworzony, o ile połączenie z bazą szwankuje.

0

No tak. Łapiesz wyjątek przy con.createStatement(); i potem jeszcze w finally się do nieistniejącego con odwołuje.

Sformatuj ten kod lepiej.

BTW:

for ( int j=1;j<=colCount;j++)
    columns[j-1].add(rs.getString(j));

nie prościej:

for ( int j=0;j<colCount;j++)
    columns[j].add(rs.getString(j+1));
0

Tylko że w razie gdy funkcja sypnie mi wyjątkiem po utworzeniu połączenia, to bez finally zawiśnie niepotrzebnie.

Poza tym pytanie dalej jest takie samo - dlaczego jest problem z połączeniem , skoro nie było go przy otwieraniu apletu w applet Viewerze. Domyślam się ze mogę coś robić źle przy podpisywaniu appletu przez netbeansa, ale nie mam zielonego pojęcia co.

0

Moim zdaniem powinieneś używać krótszych bloków try z precyzyjnym łapaniem konkretnych wyjątków (Exception, to wyjątkowo zły pomysł bo może Ci się złapać dosłownie wszystko.) W szczególności należy wydzielać bloki try dla samego inicjowania zmiennych. Nie ma też nic gorszego niż pojawienie się wyjątku w bloku catch lub finally bo Java jest tak zaimplementowana, że zgubi pierwszy wyjątek zastępując go nowym.
Poza tym co za problem napisać if(con != null) con.close() ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1