1

我有一个用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)
    {
        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();
        }
    }
}

这在一段时间内效果很好,然后有时我会收到一个导致程序崩溃的错误。

在调试模式下运行时,我会在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 以及如何阻止它!

编辑:多亏了很多帮助,现在事实证明这是我正在捕获的异常,并试图获取其原因为空。仍在尝试找出它的来源!

4

5 回答 5

1
  if((newResponse==null) || ("".equals(newResponse))

或者使用辉煌的番石榴:

  if(Strings.isNullOrEmpty(newResponse))
于 2012-08-22T09:32:51.407 回答
1

我的猜测是 processMessage 中抛出了一个异常,被捕获在它下面的 catch 中,但 getCause 为空。

1/ 尝试在处理之前记录异常

2/ 查看processMessage,应该有抛出异常。

于 2012-08-22T09:52:28.727 回答
0

我看到的一件事是,在 reportMessage() 中,您正在检查 newResponse 是否为空字符串 - 但是您之前没有对其进行初始化,因此它很可能为 null。可能你想要的是

if(newResponse == null) {
    newResponse = new String();
}
于 2012-08-22T09:36:43.437 回答
0

message或者newResponse可能为 null,因为它将被编译器转换为message.toString()并由newResponse.toString()编译器转换。

为空检查添加条件:

if(message != null && newResponse!=null) {
   newResponse = newResponse + message;
} else {
   // throw exception ...
}
于 2012-08-22T09:31:00.313 回答
0

代替:

if("".equals(newResponse))

用这个:

if(newResponse==null)

空字符串与null对象不同;因此,在 is 的情况下newResonsenull它不会使用适当的String对象进行初始化,并且您最终会使用 NPE。

于 2012-08-22T09:31:41.910 回答