【问题标题】:Avoid the termination of an applicaiton due to an exception generated by a thread避免由于线程产生异常而终止应用程序
【发布时间】:2018-04-02 11:28:39
【问题描述】:

我正在开发一个带有 Java 套接字的客户端 - 服务器应用程序。

客户端必须等待服务器的响应。当服务器接收到客户端的请求时,它会执行某些任务以获得必须传递给客户端的结果 - 但执行这些任务可能会导致错误。

有没有什么方法可以在出现这个错误时应用程序不会终止并且可以继续处理请求?

package Socket;

import javax.swing.*;

import java.awt.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server  
{
    public static void main(String[] args) 
    {       
        MainWindow application=new MainWindow();

        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         
    }   
}

class MainWindow extends JFrame implements Runnable
{

    public MainWindow()
    {       
        setBounds(1200,300,280,350);                

        JPanel myPanel= new JPanel();

        myPanel.setLayout(new BorderLayout());

        text=new JTextArea();

        myPanel.add(text,BorderLayout.CENTER);

        add(myPanel);

        setVisible(true);

        Thread t= new Thread(this);

        t.start();      
    }

    private JTextArea text;

    @Override
    public void run() 
    {
        try 
        {
            ServerSocket Server = new ServerSocket(9999);

            while(true)
            {
                Socket mySocket = Server.accept();

                DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());

                String message  = input_stream.readUTF();

                someMethod();           //This method can generate an exception, then the application closes and I can not receive new requests

                text.append("\n" + message);

                mySocket.close();
            }                        
        } 
        catch (IOException ex) 
        {
            Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

【问题讨论】:

  • 你的意思是像try-catch?
  • 什么样的异常?一个 IO 异常?是的?你已经抓住了他们。一些运行时异常?也捕获运行时异常。
  • 是的,类似的
  • @JohannesKuhn 我明白了,我会试试的。谢谢
  • 您可能想添加一个finally 以在最后关闭您的套接字。

标签: java sockets exception java-threads


【解决方案1】:

在循环中捕获异常。

ServerSocket Server = new ServerSocket(9999);

while(true) {
   try {
       Socket mySocket = Server.accept();
       DataInputStream input_stream = new DataInputStream(mySocket.getInputStream());
       String message  = input_stream.readUTF();

       someMethod();           //This method can generate an exception, then the application closes and I can not receive new requests
       text.append("\n" + message);
       mySocket.close();
   } catch (IOException ex) {
        Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
   }
}                        

然后您将记录异常并继续。

PS:可能有一些例外情况意味着重试是徒劳的,您需要放弃该过程,而不是在日志中填满无数严重错误。

我建议阅读文档并设计一个比“忽略一切并继续前进”更成熟的错误处理策略。

【讨论】:

    【解决方案2】:

    try-catch 不必一次遍历所有代码。您在整个run 方法中使用的方法对于记录真正致命的错误非常有用。您可以在 someMethod(); 周围再设置一个,以防止这些异常打破循环:

    try {
        someMethod();
    } catch(ZeroDivisionException e) {
        // handle the exception
    } catch(SomeOtherException e) {
        // handle the other exception
    }
    

    这里的例外是编造的,但我相信你明白了。你如何处理它们取决于你。只要你不重新抛出任何一个,循环就不会结束,你的外部块也不会被触发。

    您可以随意嵌套 catch 块,因此您可以在内部块和外部块中捕获 IOException。外部块仍会清除您无法控制的错误。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2014-11-03
      • 2014-01-05
      相关资源
      最近更新 更多