2017-06-02 94 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())的行;需要關閉當時爲空的套接字。