简单静态主程序中的NullPointerException

时间:2015-02-17 01:21:33

标签: java eclipse if-statement java.util.scanner

我不知道自己做错了什么。

Exception in thread "main" java.lang.NullPointerException
    at helloWorld.HelloWorld.main(HelloWorld.java:30)

随意告诉我一个更好的方法。 错误似乎是我在扫描期间做错了 " String feels1 = scan2.nextLine();"在第13行。我认为可能有一种更简单的方式来写这个,但我只是在测试。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Hello");
    System.out.println("Who am I speaking with?");
    String name = scan.nextLine();
    System.out.println("Hello " + name + "!"); 
    String feels = null;

    do{
        System.out.println(name + ", how are you doing today?");
        System.out.println("[Good] [Bad] [Ok]");
        Scanner scan2 = new Scanner(System.in);
        String feels1 = scan2.nextLine();
        if (!feels1.equalsIgnoreCase("good") || !feels1.equalsIgnoreCase("bad")
                || !feels1.equalsIgnoreCase("ok")){
            break;
        } else {
            System.out.println("I don't understand you.");
        }   
    } while ( !feels.equalsIgnoreCase("good") ||!feels.equalsIgnoreCase("bad")||
            !feels.equalsIgnoreCase("ok") );


            // The error lies here.
            if ( !feels.equalsIgnoreCase("good") ){
                System.out.println("Im glad you're feeling good!");

            }else if (!feels.equalsIgnoreCase("bad")){
                System.out.println("I hope you feel better!");

            }else{
                System.out.println("I'm sure you'll feel better soon enough.");

    }               

}

编辑:

  public static void main(String[] args) {
                Scanner scan = new Scanner(System.in);
                System.out.println("Hello");
                System.out.println("Who am I speaking with?");
                String name = scan.nextLine();
                System.out.println("Hello " + name + "!");

            do{
                    Scanner scan2 = new Scanner(System.in);
                    String feels = scan2.nextLine();
                    System.out.println(name + ", how are you doing today?");
                    System.out.println("[Good] [Bad] [Ok]");
                    if (!feels.equalsIgnoreCase("good") || !feels.equalsIgnoreCase("bad")
                                    || !feels.equalsIgnoreCase("ok")){
                            break;
                    } else {
                            System.out.println("I don't understand you.");
                    }      
            } while ( !feels.equalsIgnoreCase("good") ||!feels.equalsIgnoreCase("bad")||
                            !feels.equalsIgnoreCase("ok") );
                            if ( !feels.equalsIgnoreCase("good") ){
                                    System.out.println("Im glad you're feeling good!");

                            }else if (!feels.equalsIgnoreCase("bad")){
                                    System.out.println("I hope you feel better!");

                            }else{
                                    System.out.println("I'm sure you'll feel better soon enough.");

            }                              

    }

1 个答案:

答案 0 :(得分:1)

你的感觉变量永远不会为空。换句话说,你在哪里为它赋值:

feels = "something"; // ????

在使用它之前给它一个字符串。

更重要的是,您需要学习如何调试NPE(NullPointerException)的一般概念。 您应该批判性地读取异常的堆栈跟踪以查找出错的代码行,抛出异常的行,然后仔细检查该行,找出哪个变量为null,然后追溯到您的代码,看看为什么。你会一次又一次地碰到这些,相信我。

例如,您的错误消息告诉您查看第30行:HelloWorld.java:30,我敢打赌,在此行中您尝试取消引用感知变量。看到这个,您应该知道在使用之前检查您的代码到思考您为此变量分配的内容。这样做,你就会立即发现你的错误。


修改

您的最新代码基本上如下所示:

do {
   String feels = "something"
} while(feels.equalsIgnoreCase(foo));

但这里的问题是,感觉是在do块内部声明的,并且只在do块中可见(在形成块的花括号内),因此在while的布尔条件下是不可见的。你想在do块之前声明感觉,以便while条件可以使用它。例如,

String feels = "";
do {
   feels = "something"
} while(feels.equalsIgnoreCase(foo));