2010-05-12 101 views
4

注意:如果您不想要,這是家庭作業/任務感覺不應答。NullPointerException和處理它的最佳方式

一些搜索後,確定並閱讀這些:

How to check if array element is null to avoid NullPointerException in Java Gracefully avoiding NullPointerException in Java http://c2.com/cgi/wiki?NullPointerException

現在還不能就如何處理NullPointerException異常錯誤在我的代碼的任何進展,片段爲可疑代碼:

int findElement(String element) { 
      int retval = 0; 

      for (int i = 0; i < setElements.length; i++) { 
       if (setElements[i].equals(element)) { // This line 31 here 
        return retval = i; 

       } 
       else { 
        return retval = -1; 
       } 
      } 

      return retval; 
     } 

     void add(String newValue) { 
      int elem = findElement(newValue); 
      if(numberOfElements < maxNumberOfElements && elem != -1) { 
       setElements[numberOfElements] = newValue; 
       numberOfElements++; 
      } else { System.out.println("Element " + newValue + "already exist"); } 
     } 

它編譯但向集添加新元素會引發NullPointerException錯誤。

D:\javaprojects>java SetDemo 
Enter string element to be added 
A 
You entered A 
Exception in thread "main" java.lang.NullPointerException 
     at Set.findElement(Set.java:31) 
     at Set.add(Set.java:44) 
     at SetDemo.main(Set.java:145) 

我增加了一個檢查,但老實說,沒有線索,如果這項權利管線31 如果(setElements!= NULL & & setElements [I] .equals(元素)),但仍然沒有喜悅。

非常感謝文檔/提示或解釋。

學習, 羽扇

+2

使用調試器。 – bmargulies 2010-05-12 01:22:35

回答

4

你初始化setElements地方?含義:

String[] setElements = new String[100]; 

如果你簡單地聲明數組變量:

String[] setElements; 

,因爲它被初始化爲null類的數據成員。你必須使它指向某些東西。你可以這樣做在線:

public class MyClass { 
    private String[] setElements = new String[100]; 
    ... 
} 

或在構造函數中:

public class MyClass { 
    private String[] setElements; 

    public MyClass() { 
    setElements = new String[100]; 
    } 
    ... 
} 
3

應該setElements[i] != null && setElements[i].equals(element)。如果集合包含空元素,那麼當您調用該元素上的equals方法時,您將嘗試解引用空引用。

至於NullPointerException - 你應該從來沒有趕上它。對於不應該爲null的內容,它們必須正確初始化。對於那些不能爲空的東西 - 在解引用它們(即調用它們的方法)之前,必須檢查它們是否爲null。

捕獲NullPointerException的唯一用例是當您使用的第三方庫沒有源代碼時,並且導致引發NullPointerException的錯誤。這些情況很少見,因爲你只是開始學習Java,忘記我提到了這一點,並專注於更重要的事情。

+0

我想你的意思是 「空指針異常」 的NullReferenceException是一個C#/。NET的事情,但這個問題是關於Java的。 – 2010-05-12 02:09:02

+0

那的確是我的意思是,謝謝你的糾正, – 2010-05-12 02:18:01

1

嘗試測試元素本身爲空,而不是數組:

setElements[i] != null && setElements[i].equals(element) 
3

的for循環findElement沒有意義。

for (int i = 0; i < setElements.length; i++) { 
       if (setElements[i].equals(element)) { // This line 31 here 
        return retval = i; 

       } 
       else { 
        return retval = -1; 
       } 
      } 

你應該返回-1前通過所有值迭代,只有這樣你才能知道存在匹配element設定的任何元素。

+1

+1,但它不會回答這個問題。:) – 11684 2012-10-02 12:06:44

1

您不應該嘗試捕獲空指針異常。相反,爲了避免空指針的最好辦法是:

  • 在你假設參數爲非空是需要參數的任何功能,隨時檢查參數爲非空,拋出IllegalArgumentException如果是空值。
  • 每當您調用一個不允許空參數的函數時,請確保您沒有將空指針傳遞給該函數;如果你已經知道該對象是非空的(因爲你已經檢查過它並且會拋出一個IllegalArgumentException),那麼你不需要重新檢查;否則,在傳遞它之前,您應該仔細檢查該對象是否爲非空。

由於您不檢查參數到您的findElement並添加函數,所以參數很可能是罪魁禍首。如果它們爲空,添加適當的檢查並拋出IllegalArgumentException。如果在你這樣做後,你會得到一個IllegalArgumentException,那麼你已經解決了你的問題。如果沒有,那麼你至少知道問題不是參數,而是代碼中的其他地方。

3

發佈整個班級 - 此片段無用。

你犯了兩個嚴重的錯誤:不相信編譯器,並假設你的代碼是正確的。

如果JVM告訴你第31行是問題,請相信它。

我的猜測是setElements[i]爲空。

0

它的工作現在,謝謝拉爾斯,伊戈爾和其他誰花時間批評的代碼,有一個邏輯錯誤,不檢查,無論如何這裏是更正的工作代碼,最後我很費心我做作弊? :(

int findElement(String element) { 
      int retval = 0; 

      for (int i = 0; i < setElements.length; i++) { //loop first to the array and only return -1 once we can't find it.   
     //setElements[i] != null is the NullPointerException killer :) 


       if (setElements[i] != null && setElements[i].equals(element)) { 
        return retval = i; 

       } 
      retval = -1; 
      } 

      return retval; 
     } 

     void add(String newValue) { 
      int elem = findElement(newValue); 
      if(numberOfElements < maxNumberOfElements && elem == -1) { # == instead of != as I only need to add if elements is non-existing 
       setElements[numberOfElements] = newValue; 
       numberOfElements++; 
      } 
     } 

與感謝, 羽扇

+0

不要忘記對你認爲有用的答案進行回答。 – trashgod 2010-05-12 02:23:35

+0

順便說一句,如果您使用java.util.List實現之一而不是String數組,則可以完全清除findElement方法並使用List.indexOf(Object)。當然,你的作業可能不允許你這樣做。 – fish 2010-05-12 07:30:09