我有一个用java编写的Android应用程序。
该应用基本上连接到发送应用消息的设备。应用程序在处理每条消息之前等待消息进入然后报告它们。
我有一个连接类和一个监听器类。
连接类通过构造函数启动,该构造函数设置侦听器类以侦听来自设备的消息。
当收到消息时,监听器会将消息发送到Connection类的方法 reportMessage()。这是处理消息的地方。
监听器类位于单独的线程上。
代码如下所示。
public class Connection
{
private String response;
private String newResponse;
private DataInputStream reader;
private DataOutputStream writer;
private Socket socket;
private boolean keepListening;
private Listener listener;
public Connection (String _ipAddress, int portNumber)
{
newResponse = "";
try
{
socket = new Socket(_ipAddress, _port); //Connect to the server and its socket
writer = new DataOutputStream(socket.getOutputStream()); //Connect to the server to receive and send messages
reader = new DataInputStream(socket.getInputStream());
listener = new Listener(reader, this); //Create a new listener for the client
new Thread(listener).start(); //Set the listener off running
}
catch (Exception e)
{
...
}
}
public synchronized void reportMessage(String message)
{
try
{
if("".equals(newResponse))
{
newResponse = new String();
}
newResponse = newResponse + message;
System.out.println("Message Received: " + newResponse);
processMessage(); //Process the message
}
catch (Exception e)
{
response = e.getCause().toString();
}
}
}
public class Listener implements Runnable
{
private DataInputStream reader = null;
private boolean keepListening;
private String serverMessage;
private Connection connection;
public Listener (DataInputStream inFromServer, Connection connection)
{
reader = inFromServer;
//Get the client connection's message transfer
keepListening = true;
this.connection = connection;
}
public void run()
{
while (keepListening)
{
try
{
if (reader.available() > 0)
{
byte[] readInData = new byte[reader.available()]; //Initialise the array
reader.read (readInData); //Read in the data
serverMessage = Utils.byteToString(readInData);
connection.reportMessage(serverMessage); //Report the message
}
}
catch (IOException e)
{
System.out.println("Error reading." + e.getLocalizedMessage().toString());
keepListening = false;
}
keepListening = connection.getKeepListening();
}
}
}
这种方法很有效,但有时我会收到一个错误,导致程序崩溃。
在调试模式下运行时,我会在连接类的 reportMessage()的第一行上抛出 NullPointerException 。
程序暂停在第一行的任何行上,无论是 System.out.println 还是一行实际代码。
并且错误不会被try和catch捕获。它崩溃了程序,即使它发生在try和catch中,也没有处理错误。
这让我相信 reportMessage()方法中的任何内容都不会引发错误。如果是这种情况,则可能在Listener类 .run()中抛出错误。
但是,我无法看到可以抛出任何 NullPointerException 的地方,因为我试图进行所有检查,当它被抛出时,它会在发送消息时被抛出。
调试器说“异常堆栈跟踪不可用”。
LogCat说:
08-21 10:35:57.894: E/AndroidRuntime(1118): FATAL EXCEPTION: Thread-12
08-21 10:35:57.894: E/AndroidRuntime(1118): java.lang.NullPointerException
08-21 10:35:57.894: E/AndroidRuntime(1118):atCom.que.wifiaudio.Connection.reportMessage(Connection.java:339)
08-21 10:35:57.894: E/AndroidRuntime(1118): at com.que.wifiaudio.Listener.reportIncomingMessage(Listener.java:93)
08-21 10:35:57.894: E/AndroidRuntime(1118): at com.que.wifiaudio.Listener.run(Listener.java:67)
08-21 10:35:57.894: E/AndroidRuntime(1118): at java.lang.Thread.run(Thread.java:1102)
任何人都可以帮助我吗?
我需要知道是什么引发了NullPointerException以及如何阻止它!
编辑:感谢很多帮助,现在证明它是我捕获的异常,并试图找到其原因为null。仍然试图弄清楚它来自哪里!答案 0 :(得分:1)
if((newResponse==null) || ("".equals(newResponse))
或者使用辉煌的番石榴:
if(Strings.isNullOrEmpty(newResponse))
答案 1 :(得分:1)
我的猜测是在processMessage中引发了一个异常,它被捕获了,但getCause为null。
1 /尝试在处理之前记录异常
2 /查看processMessage,应该抛出一个异常。
答案 2 :(得分:0)
message
或newResponse
可能为null,因为它会被编译器转换为message.toString()
和newResponse.toString()
。
为空检查添加条件:
if(message != null && newResponse!=null) {
newResponse = newResponse + message;
} else {
// throw exception ...
}
答案 3 :(得分:0)
而不是:
if("".equals(newResponse))
使用此:
if(newResponse==null)
空字符串与null
对象不同;因此,如果newResonse
为null
,则不会使用正确的String
对象进行初始化,您最终会使用NPE。
答案 4 :(得分:0)
我看到的一件事是在reportMessage()中,你正在检查newResponse是否是一个空字符串 - 但是你之前没有初始化它,所以它很可能是null。可能你想要的是
if(newResponse == null) {
newResponse = new String();
}