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

Java 无法捕获从该服务器引发的异常,java,exception,Java,Exception,我做过这样的事情: try { client = new Client(this, "192.168.0.108", 5204); }catch(ConnectException e) { e.printStackTrace(); } IDE说: ConnectException的不可访问捕获块。这个例外永远不会发生 从try语句体抛出 但当我运行它并强制关闭程序(它运行的GUI窗口)时,它会从该代码行(客户端对象)生成异常 我知道在try-block中,我没有任何东西可以正式

我做过这样的事情:

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

ConnectException的不可访问捕获块。这个例外永远不会发生 从try语句体抛出

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

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

如何捕获该异常

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

摘自来源:


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

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

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

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

你能显示你的堆栈跟踪吗?那么它不是一个例外。。。或者至少不是你正在导入的,你在这里导入的是一个选中的异常。。。这意味着它要么需要在内部处理(使用try-catch),要么使用throws放置在方法声明中。。这将迫使您在提供的代码中处理它。。。检查importStack跟踪:我确信我导入的是正确的异常。您可能没有导入正确的
客户端
或正确的
连接异常
。非常感谢。现在有道理了。所以我无法以任何方式捕获它?当客户端构造函数捕获它时就不能了。如果捕获非常重要,您可以从处理库源中删除客户端的try-catch,并构建库的自定义版本,或者使用Javassist或CGLIB修改客户端的字节码,并在捕获中添加所需的自定义逻辑。修改源将更有效;Javassist或CGLIB可能更容易。
catch (SQLException | IOException | ClassNotFoundException e) {
    if (e.toString().contains("InvalidClassException")) {
        invalidClassExceptionHandler();
    }
    else {
        e.printStackTrace();
    }
}