从该异常抛出时无法捕获异常

时间:2019-12-11 19:03:09

标签: java exception

我已经做了类似的事情:

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

IDE说:

  

ConnectException的无法访问的catch块。这种例外永远不会   从try语句主体抛出

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

我知道-try-块中没有什么可以正式引发Exception的东西,但实际上是从该块引发Exception的。

如何捕获该ConnectException?

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

2 个答案:

答案 0 :(得分:2)

您的IDE抱怨,因为您要捕获的异常已在Client的构造函数中捕获。

来自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,因此处理库已经捕获了该异常。由于该异常不会重新引发,因此不会传播到您的自定义try-catch并使它变得多余。

答案 1 :(得分:0)

对于遇到这个问题的价值,我只是检查了堆栈跟踪的String以查找需要拦截的特定异常,然后我有一个方法来处理它。但是,我不是为“关键任务”应用程序编码的,我只是一个业余程序员。我认为最好的答案是Travieso引用Javassist和GLIB的使用的第二个评论中的第一个答案,但是对于我而言,实现该解决方案的学习曲线太陡了。

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

catch (SQLException | IOException | ClassNotFoundException e) {
    if (e.toString().contains("InvalidClassException")) {
        invalidClassExceptionHandler();
    }
    else {
        e.printStackTrace();
    }
}
相关问题