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方法。
我不知道为什么会发生这种情况。我很感激任何建议。
答案 0 :(得分:3)
我猜in
是BufferedReader
。如果到达End Of The Stream,readLine
将返回null。
答案 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)