2013-04-24 34 views
1

我必須從文本文件讀取一些信息到不同的字符串數組。所以,我爲這個任務寫了一個方法。下面是代碼:但是之後用戶自定義文件讀取函數導致NullPointerException Java

private String[] stateNames; 
. 
. 
. 
readHelper(stateNames); 
. 
. 
. 
private void readHelper(String[] str) // str is stateNames 
    { 
     try 
     { 
      strLine = bufferReader.readLine(); 
      String[] tokens = strLine.split(","); 
      str = new String[ tokens.length ]; 
      copyStr2Str(tokens, str); 
      insertionSort(str); // Everything is fine, str contains the data 
     } 
     catch (IOException ex) 
     { 
      Logger.getLogger(Generator.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } // End of readHelper() 

readHelper()執行stateNames變得null。我想,我會導致一些指針錯誤。

回答

3

在Java中,參數作爲引用的副本傳遞。

當你這樣做,

str = new String[ tokens.length] 

你放棄該方法調用所傳遞的參考,並創建一個新的(僅生活,直到創建該try範圍的結束)。原始stateNames一直指向原始值,即null

修改方法以返回str數組並將其分配給stateNames

更新回答評論:

要理解這一點,請試試這段代碼。

public class MyClass { 
    private List<String> originalList1 = new ArrayList<String>(); 
    private List<String> originalList2 = new ArrayList<String>(); 

    public void run() { 
     this.test(originalList1, originalList2); 
    } 

    public void test(List<String> list1, List<String> list2) { 
     list1 = new ArrayList<String>(); 
     list1.add(new String("Hello")); 
     list2.add(new String("World")); 
     System.out.println("list1.size -> " + list1.size()); 
     System.out.println("originalList1.size -> " + originalList1.size()); 
     System.out.println("list2.size -> " + list2.size()); 
     System.out.println("originalList2.size -> " + originalList2.size()); 
    } 
    } 

既然你分配一個新的對象列表1,原來的基準失去了原來的對象不會受到影響(但列表2,你還在使用原始的對象)。由於在您的代碼中創建了新的String[],因此您不再使用原來的代碼。

+0

返回「str」不會導致未來「nullptrexception」,對不對? – ciyo 2013-04-24 23:07:17

1

您應該返回數組作爲方法的返回值。

private String[] readHelper() 
    { 
     String[] str = null; 
     try 
     { 
      strLine = bufferReader.readLine(); 
      String[] tokens = strLine.split(","); 
      str = new String[ tokens.length ]; 
      copyStr2Str(tokens, str); 
      insertionSort(str); // Everything is fine, str contains the data 
     } 
     catch (IOException ex) 
     { 
      Logger.getLogger(Generator.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return str; 
    } // End of readHelper()