这是我的完整代码:
import javax.swing.JOptionPane;
public class Lab5bug {
public static void main(String[] args) {
int x=0;
String str;
for (;;)
{
str = JOptionPane.showInputDialog("Enter a grade 0-100\n(Hit Cancel to abort)");
if (str==null || str.equals(""))
break;
x = Integer.parseInt(str);
if (x>=0 && x<=100)
break;
JOptionPane.showMessageDialog( null, "Invalid grade, try again");
}
if (str != null & !str.equals("")) //<===========BUG: NEEED TO USE &&
//&,||.| are all lead to bug if we press Cancel.
//str can be null it does not pass 1st condition
//but still pass 2nd condition
//str can be "" pass first condition but not second condition
//and therefre it still show the message The grade is 0
//But why
JOptionPane.showMessageDialog( null, "The grade is " + x);
}
}
当我运行程序并在第一个对话框中按“取消”时,程序将返回错误:
Exception in thread "main" java.lang.NullPointerException
at Lab5bug.main(Lab5bug.java:19)
我已经在这一行找到了问题所在 if(str!= null&amp;!str.equals(&#34;&#34;)) 但为什么只有&amp;&amp;作品?我不明白这背后的逻辑。
答案 0 :(得分:2)
&
不会使语句短路,这意味着如果str != null
为false,它仍会尝试str.equals("")
,如果str
为空,则会导致NPE。即使第一部分为假,系统也会用&
天真地评估语句的第二部分。
&&
有效,因为它使语句短路,如果str != null
为假,它会从不评估语句第二部分并避免NPE的语句中断开;因为如果第一个值为false,则该语句不能为true。
大部分时间&&
比&
更合适。
同样的规则适用于OR,|
和||
。 true | throw new RuntimeException("Second part of statement was evaluated ");
将抛出该异常,而true || throw new RuntimeException("Second part of the statement was evaluated")
将不会到达异常,因为该语句保证为true,因为该语句的第一部分的计算结果为true,因此它会从语句中短路并中断。
答案 1 :(得分:0)
替换
if (str != null & !str.equals(""))
与
if (str != null && !str.equals(""))
&
代表按位AND。因此,当str
为空时,表达式!str.equals("")
会抛出NullPointerException
。使用逻辑AND运算符&&
时,由于第一个条件!str.equals("")
为false,因此无法达到str != null
表达式。