为什么这段代码在这里给我一个null异常错误?

时间:2017-10-23 09:19:01

标签: java arrays arraylist java.util.scanner argumentnullexception

为什么抛出空异常指针错误,我该如何解决这个问题谢谢。如果你能解释该怎么做。我试图将每行从txt文件存储到arraylist中,该arraylist进入一个更大的单独行数组列表。

    public static ArrayList<ArrayList<String>> addAfter(String file1)throws IOException{
    Scanner scanner = new Scanner(new File(file1));
    ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>(); 
    ArrayList<String> a = null;
    boolean check = false;
    while(scanner.hasNextLine())
    {
        String str = scanner.nextLine();
        String[] stringArr = str.split(" +");
        for(int i=0; i<stringArr.length; i++){
            a.add(stringArr[i]); //null exception being thrown here
        }
        stringArr = null;
        arr.add(a);
        a.clear();
    }
    return arr;
    }

3 个答案:

答案 0 :(得分:1)

因为这个:

ArrayList<String> a = null;

ArrayList已声明但未初始化。因此,当您访问for循环中的ArrayList时,您基本上是访问引用null的变量a。

相反,请执行:

ArrayList<String> a = new ArrayList<String>();

此外,您的代码中还有另一个问题: 您希望创建一个ArrayList的ArrayList,您在该循环中传递相同对象的引用(不在循环中创建新的ArrayList)并在for循环结束时清除它。这会导致将相同的ArrayList添加到ArrayList<ArrayList<>>的所有索引中。 您必须为要在arrayList中插入的每个新行执行new ArrayList<String>()

修改代码以执行相同的操作:

public static ArrayList<ArrayList<String>> addAfter(String file1)throws IOException{
Scanner scanner = new Scanner(new File(file1));
ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>(); 
ArrayList<String> a = null;
boolean check = false;
while(scanner.hasNextLine())
{
    a = new ArrayList<String>(); // add this
    String str = scanner.nextLine();
    String[] stringArr = str.split(" +");
    for(int i=0; i<stringArr.length; i++){
        a.add(stringArr[i]); //null exception being thrown here
    }
    stringArr = null;
    arr.add(a);
    //a.clear(); -- remove this line
}
return arr;

在Java中,您传递引用而不是值(对象)。

答案 1 :(得分:1)

您没有初始化“a”ArrayList对象。

ArrayList<String> a = new ArrayList<>();

而不是

ArrayList<String> a = null;

在Java中,对象变量不包含对象本身,而是对对象在内存中的实际位置的引用。当您获得NullPointerException时,这意味着Java无法访问对象,因为对象变量为null而不是对对象的引用。

答案 2 :(得分:1)

使用此功能。

ArrayList<String> a = new ArrayList<>();
相关问题