2017-06-02 95 views
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 
+1

如果你的问题是如何捕捉到不同于IOException的SocketException,我相信java会落后于捕获行。这意味着,如果首先捕获更具体的SocketException,然后捕获另一个catch块中的IOException,则可以采用不同的方式处理它们。 –

+0

由于SocketException - 您的应用程序不会崩溃 - 您正在捕获它并记录错误,并且您的应用程序将在此之后继续。还有其他事情正在导致事故的发生。如果您的日志过于混乱,请尝试暂时注释掉'e.printStackTrace()'来找出实际导致崩溃的内容。 – 1615903

+0

无法将其添加到评论,所以我编辑完整的错误日志的问题。与片段 – kbluue

回答

0

定了!发现错误setSocket(mServerSocket.accept())的行;需要关闭当时为空的套接字。