0
我尝试在使用网络服务发现(NSD)时编写应用程序,并且我注意到每当它崩溃时,错误行都来自尝试中的代码块/catch.I无法为SocketException指定catch,因为我相信(因为我试过)IOException也覆盖了它。我如何继续?尽管使用了Try/Catch,Android应用程序崩溃了
下面是代码
class ServerThread implements Runnable {
@Override
public void run() {
try {
mServerSocket = new ServerSocket(0);
setLocalPort(mServerSocket.getLocalPort());
while (!Thread.currentThread().isInterrupted()) {
Log.d(TAG, "ServerSocket Created, awaiting connection");
setSocket(mServerSocket.accept()); //line of error
Log.d(TAG, "Connected.");
Toast.makeText(context, "Connected", Toast.LENGTH_SHORT).show();
if (mChatClient == null) {
int port = mSocket.getPort();
InetAddress address = mSocket.getInetAddress();
connectToServer(address, port);
}
}
} catch (IOException e) {
Log.e(TAG, "Error creating ServerSocket: ", e);
e.printStackTrace();
}
}
}
以下是完整的错误日志
06-02 06:07:43.804 26779-26779/com.example.android.nsdchat E/MultiWindowProxy: getServiceInstance failed!
06-02 06:07:43.829 26779-26786/com.example.android.nsdchat E/art: Failed sending reply to debugger: Broken pipe
06-02 06:07:45.117 26779-26794/com.example.android.nsdchat E/ONS: 1. NsdChat (_http._tcp. -- 0 -- 0)
06-02 06:07:47.132 26779-26796/com.example.android.nsdchat E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f9de01110
06-02 06:07:56.925 26779-26779/com.example.android.nsdchat E/IAE: listener in use
06-02 06:07:59.331 26779-26779/com.example.android.nsdchat E/IAE: listener in use
06-02 06:08:04.004 26779-26794/com.example.android.nsdchat E/NsdHelper: Resolve Succeeded. name: NsdChat, type: ._http._tcp, host: /192.168.82.103, port: 48308
06-02 06:08:05.995 26779-26796/com.example.android.nsdchat E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f9da665c0
06-02 06:08:07.364 26779-26796/com.example.android.nsdchat E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f9da6c990
06-02 06:08:07.716 26779-26793/com.example.android.nsdchat E/ChatConnection: Error creating ServerSocket:
java.net.SocketException: Socket closed
at libcore.io.Posix.accept(Native Method)
at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:63)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:94)
at java.net.ServerSocket.implAccept(ServerSocket.java:217)
at java.net.ServerSocket.accept(ServerSocket.java:141)
at com.example.android.nsdchat.ChatConnection$ChatServer$ServerThread.run(ChatConnection.java:153)
at java.lang.Thread.run(Thread.java:818)
06-02 06:08:07.997 26779-26796/com.example.android.nsdchat E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7f9dcd2bd0
如果你的问题是如何捕捉到不同于IOException的SocketException,我相信java会落后于捕获行。这意味着,如果首先捕获更具体的SocketException,然后捕获另一个catch块中的IOException,则可以采用不同的方式处理它们。 –
由于SocketException - 您的应用程序不会崩溃 - 您正在捕获它并记录错误,并且您的应用程序将在此之后继续。还有其他事情正在导致事故的发生。如果您的日志过于混乱,请尝试暂时注释掉'e.printStackTrace()'来找出实际导致崩溃的内容。 – 1615903
无法将其添加到评论,所以我编辑完整的错误日志的问题。与片段 – kbluue