Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获引起异常的未知后异常_Java_Exception - Fatal编程技术网

Java 捕获引起异常的未知后异常

Java 捕获引起异常的未知后异常,java,exception,Java,Exception,在感兴趣的程序中,在方法()的执行过程中,可能会发生一些与HTTP相关的异常。由于某种原因,该方法被设置为能够抛出ExpException。我只对特定类型的异常感兴趣,即UnknownHostException,可以使用 if (e.getCause().getCause().getCause() instanceof UnknownHostException) 我希望你同意这是一种非常恶劣的方式。因此,这很好: public class ExportException extends Exc

在感兴趣的程序中,在方法()的执行过程中,可能会发生一些与HTTP相关的异常。由于某种原因,该方法被设置为能够抛出ExpException。我只对特定类型的异常感兴趣,即UnknownHostException,可以使用

if (e.getCause().getCause().getCause() instanceof UnknownHostException)
我希望你同意这是一种非常恶劣的方式。因此,这很好:

public class ExportException extends Exception;

class sth{
  method() throws ExpException;
}

class main{
  try{
    method()
  } catch(ExpExceptione e){
    if (e.getCause().getCause().getCause() instanceof UnknownHostException){
        doSthElse();
    }
  }
然而,我希望做到如下所述。不幸的是,Eclipse大喊大叫

UnknownHostException的不可访问捕获块。这个例外是 从不从try语句中抛出

有什么可以帮我的吗?我不想使用getCause()^3

另外:这是一个大项目,我是新来的新手,我不想在课外捣乱,而只是“主要的”

我的程序类似于:

public class ExportException extends Exception;

class sth{
  method() throws ExpException;
}

class main{
  try{
    method()
  } catch(UnknownHostException e){
    doSth();
  } catch(ExpExceptione){
    doSthElse();
  }

UnknownHostException是IOException的一个子类型,它被选中为异常

抛出选中异常的方法必须在抛出声明中声明它们

因此,当您调用一个在声明中没有
抛出UnknownHostException
的方法时,您将永远不会捕获此异常-代码是不可访问的,编译器是正确的

您可以看到如何很好地检查异常原因是否包含任何特定的异常

static boolean hasCause(Throwable e, Class<? extends Throwable> cl) {
    return cl.isInstance(e) || e.getCause() != null && hasCause(e.getCause(), cl);
}

catch(ExpException e) {
    if (hasCause(e, UnknownHostException.class)) {
       doSmth();
    } else {
       doSmthElse();
    }
}

static boolean hasCause(Throwable e,classe此异常未被抛出。从错误消息中可以明显看出这一点。如果异常是您捕获的异常的原因,那么它不会在您试图捕获它的位置被抛出。或者您更改捕获它的代码部分,使其成为另一个异常的原因,或者您需要获取原因就像你一直在做的那样。