2010-02-16 93 views
3
class anEvent{ 
    String number; 
    String dueTime; 
} 



public static void main(String args[]) { 
     int x = args.length/2; 
     int y = args.length; 
     anEvent [] order = new anEvent [x]; 
     for(int i=0; i<x; i++){ 
     if(i==0){ 
     order[i].number = args[0]; //Line(#) 
     order[i].dueTime = args[1]; 
     } else if (i % 2 == 0){ 
     order[i].number = args[i]; 
     order[i].dueTime = args[i]; 
     } else if (i % 2 != 0){ 
     order[i].number = args[i+1]; 
     order[i].dueTime = args[i+1]; 
     } else if (i == x -1){ 
     order[i].number = args[x-1]; 
     order[i].dueTime = args[x-1]; 
     } 

     } 

Java抱怨在上面的代碼片段的第#行中存在一個空指針exceptuion。Java數組索引

怎麼回事?

PS:我知道片段可以被清理,但應該沒有問題的了上線#

+1

您沒有指定行號? – djc 2010-02-16 19:34:39

+1

您是否嘗試使用調試器來執行此操作?像這樣的問題應該很快就可以識別出來。 jdb是可用的,然後eclipse和netbeans具有集成調試器.... – 2010-02-16 19:34:53

+0

我在代碼中註釋行號(如果含糊不清)。 我是eclipse的新手(和java)我還沒有被教過調試器。 – frantic 2010-02-16 19:37:09

回答

6

當一個數組被創建,所有的數組元素都爲空。在你的情況下,你需要用new anEvent()實例填充數組。

+0

對不起,但是:「給一個人一條魚,喂他一天。教一個人去釣魚,喂他對於終身「:-)我在和你閒聊,但我認爲它是相關的。 – 2010-02-16 19:37:15

+0

我寫了anEvent []命令= new anEvent [x]; 是不是夠了? – frantic 2010-02-16 19:39:15

+1

@frantic:不,這還不夠;正如Chris所寫,它創建一個只包含空值的數組。 – 2010-02-16 19:41:36

1

讓第一線的for循環:

order[i] = new anEvent(); 

由於是,你是不是在陣列中的任何初始化(它們都是空),所以當您嘗試訪問你的領域那個例外。

0

您還沒有創建任何anEvent例如,定義數組(順序[])你是不是爲它創建的默認值。

,也有你的情況下,更簡單的數組:

List events = new ArrayList(x); 
for(int i=0; i<y; i+=2){ 
    anEvent event = new anEvent(); 
    anEvent.number = args[i]; 
    anEvent.dueTime = args[i+1]; 
    events.add(event); 
} 
anEvent[] order = events.toArray(); 
1

既然你提到,它「可以清理」,我注意到這樣的自由:

public class Thing { 
    private String number; 
    private String dueTime; 

    public Thing(String number, String dueTime) { 
     this.number = number; 
     this.dueTime = dueTime; 
    } 

    public static void main(String args[]) { 
     int x = args.length/2; 
     Thing[] order = new Thing[x]; 
     for (int i = 0; i < x; i++) { 
      if (i == 0) { 
       order[i] = new Thing(args[0], args[1]); 
      } else if (i % 2 == 0) { 
       order[i] = new Thing(args[i], args[i]); 
      } else if (i % 2 != 0) { 
       order[i] = new Thing(args[i + 1], args[i + 1]); 
      } 
     } 
    } 
} 

「 anEvent「不符合大寫的駱駝案例Java標準,所以我重命名了它。 「事情」並不特別有意義,但在這裏工作並不多。最後else if條款不能達成,因爲無論是i % 2等於零,所以我放棄了它。當然,我正在創造新的東西,它可以避免空值問題。請享用。

1

NullPointerException意味着你試圖添加一個值或執行的方法到變成是一個空的東西。

在Java對象的引用可以分配......嗯,objectsnull

當他們已經空分配這個異常被拋出:

Object o = null; 
o.toString(); // <- NullPointerException (think of null.toString()) 

數組,是對象也。當您創建一個大小的數組時,數組內的所有「框」都包含null作爲參考。

所以:

Object[] array = new Object[10]; 

創建類似以下的東西:

[null,null,null,null,null,null,null,null,null,null] 
就是爲什麼,當您執行

array[0].toString(); // or order[i].number in your specific example... 

你得到的是例外,因爲效果完全一樣:

null.toString(); // or null.number <-- NullPointerException. 

爲了解決這個問題,你必須有效的對象引用到該位置分配到數組:

for(int i=0; i<x; i++){ 
    order[i] = new anEvent(); 
    ... 
    ... 

我希望這有助於。

最後說明。在Java類的名稱以大寫字母開始,所以你的類應該已經真正成爲:

class AnEvent { 
.... 

最後,大部分的Java源代碼的使用4個空格縮進。