2016-02-27 50 views
1

我正在開發一個項目,並取得了不錯的進展,直到遇到意外的異常。這是由於引入JMenuItem而引起的,有點令人驚訝,因爲我之前做過類似的事情。如果它不是JMenuItem(class4)的子類,我發現類(class2)工作正常。我還發現了一個解決方法(class3),但我仍然想知道,我做錯了什麼。我搜索了一個答案,但沒有拿出答案,可能是因爲搜索條件不好。任何任何想法?java JMenuItem Nullpointerexception(覆蓋swing類時的初始化錯誤)

import javax.swing.JMenuItem; 

class class1 { 
    public static void main(String[] f) { 
     System.err.println(new class3(0)); 
     System.err.println(new class3(1)); 
     System.err.println(new class4(0)); 
     new class2(1); 
    } 
} 

class class2 extends JMenuItem { 
    static String[] a; 
    int b; 

    { 
     a = new String[2]; 
     a[0] = "c"; 
     a[1] = "d"; 
    } 

    public class2(int e) { 
     super(); 
     b = e; 
    } 

    public String getText() { 
     return a[b]; 
    } 

    public String toString() { 
     return class2.class + ": " + b + ", " + getText(); 
    } 
} 

class class3 extends JMenuItem { 
    static String[] a; 
    int b; 

    { 
     a = new String[2]; 
     a[0] = "c"; 
     a[1] = "d"; 
    } 

    public class3(int e) { 
     super(); 
     b = e; 
    } 

    public String getText() { 
     if (b == 0) return "g"; 
     return a[b]; 
    } 

    public String toString() { 
     return class3.class + ": " + b + ", " + getText(); 
    } 
} 

class class4 { 
    static String[] a; 
    int b; 

    { 
     a = new String[2]; 
     a[0] = "c"; 
     a[1] = "d"; 
    } 

    public class4(int e) { 
     super(); 
     b = e; 
    } 

    public String getText() { 
     return a[b]; 
    } 

    public String toString() { 
     return class4.class + ": " + b + ", " + getText(); 
    } 
} 

而且這種情況發生,當我執行的類:

$ javac class1.java 
$ java -showversion class1 
java version "1.8.0_73" 
Java(TM) SE Runtime Environment (build 1.8.0_73-b02) 
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode) 

class class3: 0, g 
class class3: 1, d 
class class4: 0, c 
Exception in thread "main" java.lang.NullPointerException 
    at class2.getText(class1.java:29) 
    at javax.swing.AbstractButton.setModel(AbstractButton.java:1779) 
    at javax.swing.JMenuItem.setModel(JMenuItem.java:173) 
    at javax.swing.JMenuItem.<init>(JMenuItem.java:150) 
    at javax.swing.JMenuItem.<init>(JMenuItem.java:110) 
    at class2.<init>(class1.java:24) 
    at class1.main(class1.java:8) 
+0

由你到哪兒去發佈一個沒有絨毛,且充分說明您的問題以極其簡單的程序的方式,一個奈斯利問的問題。這是令人耳目一新的看到這個網站的新手。 –

回答

1

最後一個NullPointerException的問題,是不是你的typical NPE question

如果你看看JMenuItem API或者如果你給你的方法的@Override註解,你會看到public String getText()是個超級方法的重寫,specifially的JMenuItem的母公司AbstractButton中的方法,並出現了超類的構造函數調用它,在你的實例初始化塊被調用之前調用它,這導致你的NPE。

這個問題說明時可能出現的風險:

  • 您擴展複雜的類。
  • 類在其構造函數中調用非最終實例方法(Swing作者爲此而感到羞愧)
  • 靜態字段未以靜態方式初始化。

解決方案爲您包括:

  • 大型和複雜的類打交道時偏袒使用超過組成繼承,更是如此。
  • 對靜態字段使用靜態初始化塊。
  • 避免使用靜態字段,除非有明確的需求。
  • 檢查創建的方法,你不是無意中覆蓋實例方法。我特別被燒燬這個時候我在不知不覺中推翻public int getX()public int getY()對於擴展的JPanel,然後不知道爲什麼我的佈局管理器不工作的權利類。