Nullpointerexception java运行时

时间:2014-10-12 11:30:38

标签: java arrays nullpointerexception

该计划略显先进;它不是。简单的数组操作。 程序编译正确,但遇到异常运行时。

Exception in thread "main" java.lang.NullPointerException
at Ordliste.leggTilOrd(Tekstanalyse.java:85)
at Tekstanalyse.main(Tekstanalyse.java:23)

所以if(s.equalsIgnoreCase(ordArray [k]))有问题。 我不明白为什么。它甚至提供正确的输出。

import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class Tekstanalyse {
    public static void main(String[] args) throws FileNotFoundException {

        Ordliste ol = new Ordliste();
        ol.lesBok("scarlet.text");
        ol.leggTilOrd("A");
    }
}

class Ordliste {
    private int i = 0;
    private String[] ordArray = new String[100000];
    private int antForekomster;
    private int arrStorrelse = 0;

    public void lesBok(String filnavn) throws FileNotFoundException {

        File minFil = new File(filnavn);
        Scanner scan = new Scanner(minFil);

        while (scan.hasNextLine()) {
            ordArray[i] = scan.nextLine();
            //System.out.println(ordArray[i]);
            i++;
            arrStorrelse++;
        }
        System.out.println("Array size: " + arrStorrelse + " Capacity: " + ordArray.length);
    }

    public void leggTilOrd(String s) {

        for (int k = 0; k < ordArray.length; k++) {
            if (s.equalsIgnoreCase(ordArray[k])) {
                antForekomster++;
                System.out.println("Den har vi sett for!");
            } else {
                s = ordArray[arrStorrelse];
            }
        }
    }
}

4 个答案:

答案 0 :(得分:0)

我很确定错误就在这里:

for (int k = 0; k < ordArray.length; k++) {
    if (s.equalsIgnoreCase(ordArray[k])) {
        antForekomster++;
        System.out.println("Den har vi sett for!");
    } else {
        s = ordArray[arrStorrelse]; // <- dangerous
    }
}

正如我在评论中所说,如果读取的文本文件不包含100.000行文本,ordArray可能包含null个元素。如果是这种情况,则上述行会将null写入s,因为s.equalsIgnoreCase(null)为false。

您应该考虑使用列表而不是数组。

private List<String> ordList = new ArrayList<String>();

(或使用不同的变量名,由您决定)

然后,您可以使用ordList.add(scan.nextLine());将新条目添加到列表中。此列表不包含任何null元素,您提到的问题应该消失。

答案 1 :(得分:0)

我强烈建议您只使用调试器来调试代码,但这里有: 在你的lesBok方法中,你用字符串填充数组并制作一个计数器arrStorrelse。是您所创建的数组中的元素数量。但是数组被填充索引0到n-1。并且arrStorrelse等于你所做的N,但为此在数组中分配空间。所以在leggTilOrd()中你第一次迭代并输入else子句就可以了吗

for (int k = 0; k < ordArray.length; k++) {
            if (s.equalsIgnoreCase(ordArray[k])) {

                antForekomster++;
                System.out.println("Den har vi sett for!");
            }

            else {
                int arrStorrelse2=arrStorrelse;
                s = ordArray[arrStorrelse];

            }

在那个else子句中,s被设置为ordArray [arrStorrElse];然而arrStorrElse在那一刻比你阵列的最后一个初始元素高一个。所以它将s设置为空指针。 然后是if子句

中循环的下一次迭代
if (s.equalsIgnoreCase(ordArray[k])) {

                    antForekomster++;
                    System.out.println("Den har vi sett for!");

s.equalsIgnoreCase()调用是在空的s上完成的,这是空指针异常的来源。

你需要更改arrStorrElse任务,你没有解释它应该做什么,所以我不能这样做你也试着学习如何调试你的代码这里是一个有用的链接:

http://www.tutorialspoint.com/eclipse/eclipse_debugging_program.htm

答案 2 :(得分:0)

我已编译并测试了您的代码。

s.equalsIgnoreCase(null)

抛出nullPointerException。

也许您应该尝试使用ArrayList而不是Array来避免迭代空值。

答案 3 :(得分:0)

我花了一些时间来弄清楚NullPointerException为什么会发生,我不得不同意Piotr和Tom:NPE是由行引起的

s.equalsIgnoreCase(ordArray[k])

和代码中的副作用。通过将s - 分支中的参数else重新分配给null(此值来自ordArray[arrStorrelse]),可以引入此副作用。重新分配后,你会有这样的事情:

null.equalsIgnoreCase(ordArray[k])

瞧,有NullPointerException