字符串比较中的空指针异常

时间:2015-04-21 16:08:33

标签: java eclipse nullpointerexception

while(true)
        {
            String input = "";
            try {
                input = in.readLine();

            } catch (IOException e1) {
                // TODO Auto-generated catch block
                System.out.println(e1 + "Exception occured when reading user input");
            }
            // Sleep
            try
            {
                Thread.sleep(USER_THROTTLE);
            }
            catch(Exception e)
            {
                System.out.println(toString()+" has input interrupted.");
            }

            if(input .equals("w")){action_event(input);}
            if(input .equals("a")){action_event(input);}
            if(input .equals("s")){action_event(input);}
            if(input .equals("d")){action_event(input);}

            if(input .equals("eat")){action_event(input);}
            if(input .equals("drink")){action_event(input);}
            if(input .equals("place")){action_event(input);}
            if(input .equals("swim")){action_event(input);}
            if(input .equals("command_kill")){action_event(input);}
            if(input .equals("help")){action_event(input);}
        }
    }

这是堆栈跟踪

Exception in thread "Thread-1" java.lang.NullPointerException
at Platypus_User$Inport.run(Platypus_User.java:64)

这是在Mac OSX上的Eclipse中运行的。 在第二个catch块之后出现空指针异常,其中字符串被比较为" w"那么如果它是" w"调用action_event方法。

我不知道为什么会发生这种情况。我很感激任何建议。

4 个答案:

答案 0 :(得分:3)

我猜inBufferedReader。如果到达End Of The Stream,readLine将返回null。

请参阅BufferedReader documentation

答案 1 :(得分:1)

BufferedReader.readLine()可以返回null,因此请在输入时检查null。

答案 2 :(得分:0)

首先,避免重复代码。您可以在一个Set中收集所有允许的输入,然后检查它是否包含特定值 - 从而使代码看起来更易读,简洁。

其次,您需要执行空检查,因为in.read()可以返回null,如其他答案中所述。 null输入也可用于终止while循环。

所以我会把你的代码重写如下:

Set<String> allowedInputs 
    = new HashSet<>(Arrays.asList("w", "a", "s", "d", "eat")); // <- add remaining allowed inputs here

String input = "";

while (input != null) {    
    try {
        input = in.readLine();
    } catch (IOException e1) {
        System.out.println(e1 + "Exception occured when reading user input");
    }
    try {
        Thread.sleep(USER_THROTTLE);
    } catch(Exception e) {
        System.out.println(toString() + " has input interrupted.");
    }
    if (input != null && allowedInputs.contains(input)) { // <- check if input is allowed
         action_event(input);
    }
}

答案 3 :(得分:0)

永远不要在未初始化的对象上调用方法。输入可以保存空值。因此,在比较之前,您必须确保该对象不为null。 处理这种情况的最佳方法是将常数值与&#34;输入&#34;进行比较。而不是将输入与常数值进行比较。 例如&#34; w&#34; .equals(输入)