我在Eclipse中有一个JUnit测试(我用Junit 3和JUnit 4试过),它检查一个解析文件的方法但是由于某些原因我不知道它冻结或挂起当我使用它时:
while(scanner.hasNextLine() && scanner !=null){
if(scanner.hasNext()){ do something }
}
但是当我使用以下内容时,它可以正常工作:
while(scanner.hasNextLine() && scanner !=null && scanner.hasNext() ){
do something
}
“do something”中的代码注意到特殊情况,除了将scanner.next()分配给变量,在两种情况下使用System.out.print()
实际输出正常。这些不是一样的吗?这是一个合理的错误(如果是这样请解释原因)还是一个愚蠢的错误?
答案 0 :(得分:3)
首先,在取消引用引用之前检查null。 变化
while(scanner.hasNextLine() && scanner !=null){
if(scanner.hasNext()){ do something }
}
到此:
while(scanner !=null && scanner.hasNextLine()){
if(scanner.hasNext()){ do something }
}
如您的示例代码所示,您将找到空扫描程序实例,但(scanner!= null)将永远不会重要。相反,您将通过NullPointerException找到空扫描程序。
接下来,您在问题中提到“将scanner.next()分配给变量”。
显示一些代码。您必须为每个hasNextLine
来电拨打一个nextLine
来电,并且您必须为每个hasNext
来电拨打一次next
来电。你可能会做这样的事情:
while (blam.hasNext())
{
blah = blam.next();
hoot = blam.next();
}
这是完全错误的。第二个下一个电话将导致问题。