2013-11-20 138 views
0

我的代碼中出現NullPointerException錯誤。我真的不知道它爲什麼會發生。這只是代碼的一個示例,如果需要,我可以發佈完整版本。Java - 空指針異常錯誤

private static final Scanner in=new Scanner(System.in); 
public static void main(String[] args) { 
    int n1=lerTamanho(); 
    String [] vec1=new String [n1]; 
    readVector(vec1); -> Line 11 
} 

private static int lerTamanho() { 
    System.out.print("Number: "); 
    int num=in.nextInt(); 
    while (num<=0) { 
     System.out.print("Error! Number: "); 
     num=in.nextInt(); 
    } 
    return num; 
} 

private static void readVector(String vec[]) { 
    int cont=0; 
    String s; 
    do { 
     System.out.print("Name: "); 
     s=in.nextLine(); 
     if (validate(s,vec)) { -> Line 30 
      vec[cont]=s; 
      cont++; 
     } else { 
      System.out.println("That name already exists!"); 
     } 
    } while (cont<vec.length); 
    } 
private static boolean validate(String s, String vec[]) { 
    boolean success=true; 
    for (int i=0; i<vec.length; i++) { 
     if (vec[i].equalsIgnoreCase(s)) { >-> Line 44 
      return !success; 
     } 
    } 
    return success; 
} 

錯誤我越來越:

Exception in thread "main" java.lang.NullPointerException 
at javaapplication63.JavaApplication63.validate(JavaApplication63.java:41) 
at javaapplication63.JavaApplication63.lerVetor(JavaApplication63.java:30) 
at javaapplication63.JavaApplication63.main(JavaApplication63.java:11) 
+0

東西一定叫做驗證傳遞null作爲S或VEC –

+1

如果你指出了這行是第41 – biziclop

+0

貌似是'vec'或單曲這將是非常有用的'(在'validate'方法中)尚未初始化。您可能想要發佈'lerVector()'方法的代碼。 – Josh

回答

3

默認情況下,在String []所有元素都被初始化null。該NullPointerException該線路拋出:

if (vec[i].equalsIgnoreCase(s)) 

爲了解決這個問題,分配與數值的元素,以前驗證

+1

非常感謝。 :) –

1

當你犯了一個新的陣列,即String [] vec1=new String [n1];,數組裏面的元素初始化爲null。因此,當您嘗試訪問vec[i].equalsIgnoreCase(s)

if (vec[i].equalsIgnoreCase(s)) { 

您得到一個NPE。

+3

我會改變這裏的措辭,說數組的元素*初始化爲'null' *而不是*未初始化*。說它是*未初始化*聽起來像它可能充滿了垃圾(就像在C/C + +中發生的新鮮分配的內存)。 Java總是將新內存設置爲「零」值,對象爲null,布爾值爲'0',布爾值爲'false'。 – DaoWen

+0

讚賞,謝謝。 – SimplyPanda

+0

@SimplyPanda謝謝。我錯過了那個細節^^ –

1
String [] vec1=new String [n1]; 

該語句初始化數組 - 它不初始化數組的單個桶。爲此,您可以在數組中查看並明確設置它們。

for (String s : vec) { 
    s = "Some String"; //or new String() 
} 
0

您已使用下面的代碼創建了一個數組。

String [] vec1=new String [n1]; 

它只創建一個包含n1個元素的數組,但這些元素中的所有值均爲null。

你可以試試下面看看。

int n1=lerTamanho(); 
String [] vec1=new String [n1]; 
for (int i=0; i < n1; i++) { 
    vec1[i]= "SOME-STRING-TO-THIS-ELEMENT"; 
} 
readVector(vec1); 

NPE來自vec[i].equalsIgnoreCase(s)其中vec[i]爲空。

1

開關vec[i].equalsIgnoreCase(s)s.equalsIgnoreCase(vec[i])

+0

你能告訴我他們之間的區別嗎? –

+1

如果vec [i]爲空,則試圖調用不存在的對象的方法。通過交換它們,該方法在s上被調用,它應該總是非空的。當它到達尚未分配的數組部分時,它基本上是's.equalsIgnoreCase(null)',它將返回false。這樣,一旦達到空值,您不必擔心從循環中斷開。如果你想保持原來的順序,你需要在 – Floegipoky

+1

之前加上if(vec [i] == null){break;}'謝謝。非常感謝 ;) –