有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法捕获从该服务器引发的异常

我做过这样的事情:

try {
    client = new Client(this, "192.168.0.108", 5204);
}catch(ConnectException e) {
    e.printStackTrace();
}

IDE说:

Unreachable catch block for ConnectException. This exception is never thrown from the try statement body

但当我运行它并强制关闭程序(它运行的GUI窗口)时,它会从该代码行(客户端对象)生成异常

我知道在try-block中,我没有任何东西可以正式抛出异常,但在真正的情况下,异常是从该块中抛出的

如何捕获该异常

堆栈跟踪: https://prnt.sc/q9hzdp


共 (2) 个答案

  1. # 1 楼答案

    当我遇到这个问题时,我只是简单地检查了堆栈跟踪的字符串,寻找我需要拦截的特定异常,然后我有了一个方法来处理它。然而,我不是为“任务关键型”应用程序编写代码,我只是一个业余程序员。我认为第一个答案和第二个评论是最好的答案,其中Travieso提到了Javassist和GLIB的使用,但是在我的例子中,实现该解决方案的学习曲线太陡峭了

    以下是我如何处理此问题的示例:

    catch (SQLException | IOException | ClassNotFoundException e) {
        if (e.toString().contains("InvalidClassException")) {
            invalidClassExceptionHandler();
        }
        else {
            e.printStackTrace();
        }
    }
    
  2. # 2 楼答案

    您的IDE正在抱怨,因为您试图捕获的异常已经在客户端的构造函数中被捕获

    摘自Client.java来源:

    public Client(PApplet parent, String host, int port) {
        ...
        try {
          socket = new Socket(this.host, this.port);
          ...
        } catch (IOException e) {
          e.printStackTrace();
          ...
        }
    }
    

    ConnectException扩展了IOException,因此处理库已捕获该异常。由于该异常不是rethrown,因此它不会传播到您的自定义try-catch,并使其成为冗余