【发布时间】:2012-08-21 09:39:03
【问题描述】:
我有一个用 java 编写的 android 应用程序。
应用程序基本上连接到发送应用程序消息的设备。在处理每条消息之前,应用程序会等待消息进入并报告它们。
我有一个 Connection 类和一个 Listener 类。
Connection 类通过构造函数启动,该构造函数设置 Listener 类来监听来自设备的消息。
当有消息进来时,Listener 将消息发送到 Connection 类中的方法 reportMessage()。这是处理消息的地方。
Listener 类在一个单独的线程上。
代码如下所示。
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)
{
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();
}
}
}
这在一段时间内运行良好,然后有时我会收到一个导致程序崩溃的错误。
在调试模式下运行时,我会在 Connection 类中 reportMessage() 的第一行抛出一个 NullPointerException。
无论是System.out.println 还是实际代码行,程序都会在第一行暂停。
并且错误不会被 try and 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 以及如何阻止它!
【问题讨论】:
-
我不知道,这是个问题。
标签: android sockets nullpointerexception synchronized uncaught-exception