尝试/捕捉干扰while循环

时间:2014-03-03 02:11:02

标签: java while-loop try-catch

所以我正在尝试编写一个搜索txt文件中特定字符串的代码,然后打印出该字符串出现的所有行。

最直接的方法似乎是通过文档运行Scanner和LineNumberReader,添加符合“找到”字符串的帐单的行。但是,每当它偶然发现不包含该单词的行时,它会抛出NullPointerException并且无论如何都会杀死循环。谁能告诉我我做错了什么?

FileReader r = new FileReader(f);
    LineNumberReader l = new LineNumberReader(r);
    Scanner s = new Scanner(l);
    int i = 1;
    String found = "Instances of string found:\n";
    {
        while (s.hasNextLine()) {
            try {
                if (s.findInLine(keyword).isEmpty() == false) {
                    found = found + l.readLine() + "\n";
                    s.nextLine();
                } else {
                    s.nextLine();
                }
            } catch (NullPointerException e) {
                s.nextLine();
            }
        }
            display(found, "Match found!");

    }

2 个答案:

答案 0 :(得分:1)

检查扫描仪的文档:如果在输入到下一行分隔符中未检测到此类模式,则返回null并且扫描仪的位置不变。

您致电s.findInLine(keyword).isEmpty() == false,如果findInLine(keyword)中未包含的字词为空,则您将调用null.isEmpty()。你有例外;)

您无需检查isEmpty()s.findInLine(keyword)!= null就足够了。

答案 1 :(得分:0)

如果您正在使用在某些情况下记录为返回null的方法,那么您应该将方法的结果分配给变量(如果您要将其用于其他内容)并且使用==!=将其测试为null。使用结果作为参考,然后依靠try/catch NullPointerException来查看它是否为null,这是非常糟糕的编程习惯。首先,如果null身体中的其他地方出现意外try怎么办?现在它会因为错误的原因而捕获异常。 NullPointerException始终表示程序错误。它永远不应该是“正常”程序逻辑的一部分。

至于为何“杀死循环”:它不应该。即使你使用try / catch是不好的做法,它应该仍然按我认为的方式工作,并且不应该杀死循环。我刚刚测试了类似于你的代码的东西,但是没有l.readLine(),它似乎表现得很好。如果您想要行号,则为l.getLineNumber(),而不是l.readLine(),它会尝试读取一行文字并可能破坏Scanner