PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NullPointerException warum?


Gast
2007-05-08, 11:50:34
Hallo Zusammen,

ich habe hier einige Packages die ich dynamisch laden will.


/*
* Main.java
*/

package testapp;

import foo.bar.Foobar; /* Package das evtl. nicht vorhanden ist */
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;

public class Main extends JDesktopPane {

/** Creates a new instance of Main */
public Main() {
if (this.getClass().getResource("/foo/bar") != null) {
foo.bar.Foobar foobar = new Foobar();
this.add(foobar); // THE DIFF
}
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Main main = new Main();
}
}


Die Zeile die ich mit THE DIFF aussteigt oder nicht, wenn ich die Packages entferne. Lasse ich die Zeile weg funktioniert es, wenn sie drin ist steigt er aus (NoClassDefFoundError(/foo/bar/Foobar).Jetzt habe ich mir mal den Bytecode dazu angeschaut, aber ich kann den Unterschied nicht erkennen.Ich hätte jetzt darauf getippt dass es sich dabei um einen Preload wg. des add() Aufrufs handelt. Aber das müsste man doch im Bytecode sehen oder?

Warum wird der Fehler geworfen?
Wie macht man es besser?


c:\programme\java\jdk1.6.0\bin\javap -c Main

public class testapp.Main extends javax.swing.JDesktopPane{
public testapp.Main();
Code:
0: aload_0
1: invokespecial #1; //Method javax/swing/JDesktopPane."<init>":()V
4: aload_0
5: invokevirtual #2; //Method java/lang/Object.getClass:()Ljava/lang/Clas
s;
8: ldc #3; //String /foo/bar
10: invokevirtual #4; //Method java/lang/Class.getResource:(Ljava/lang/Str
ing;)Ljava/net/URL;
13: ifnull 30
16: new #5; //class foo/bar/Foobar
19: dup
20: invokespecial #6; //Method foo/bar/Foobar."<init>":()V
23: astore_1
24: aload_0
25: aload_1
26: invokevirtual #7; //Method add:(Ljava/awt/Component;)Ljava/awt/Compone
nt;
29: pop
30: return

public static void main(java.lang.String[]);
Code:
0: new #8; //class testapp/Main
3: dup
4: invokespecial #9; //Method "<init>":()V
7: astore_1
8: return

}


c:\programme\java\jdk1.6.0\bin\javap -c Main
Compiled from "Main.java"
public class testapp.Main extends javax.swing.JDesktopPane{
public testapp.Main();
Code:
0: aload_0
1: invokespecial #1; //Method javax/swing/JDesktopPane."<init>":()V
4: aload_0
5: invokevirtual #2; //Method java/lang/Object.getClass:()Ljava/lang/Clas
s;
8: ldc #3; //String /foo/bar
10: invokevirtual #4; //Method java/lang/Class.getResource:(Ljava/lang/Str
ing;)Ljava/net/URL;
13: ifnull 24
16: new #5; //class foo/bar/Foobar
19: dup
20: invokespecial #6; //Method foo/bar/Foobar."<init>":()V
23: astore_1
24: return

public static void main(java.lang.String[]);
Code:
0: new #7; //class testapp/Main
3: dup
4: invokespecial #8; //Method "<init>":()V
7: astore_1
8: return

}