" JOptionPane java.lang.NullPointerException#34; Java中的错误

时间:2015-02-04 18:47:26

标签: java nullpointerexception joptionpane

这是我的完整代码:

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;作品?我不明白这背后的逻辑。

2 个答案:

答案 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表达式。