Java转换异常(不是类转换异常)

时间:2010-11-13 21:38:13

标签: java casting

当在java中捕获异常时,是否存在将异常强制转换为新类型的用例?或者是标准

    throw new DiffException(e)

唯一的方法。如果我忽视某些事情,我会道歉,但我得到的唯一搜索结果是“ClassCastExceptions”,这显然不是我想要的

4 个答案:

答案 0 :(得分:7)

我相信你的意思是'exception wrapping'。 没有其他方法可以做到这一点 - 使用构造函数创建Exception的新实例,该构造函数将另一个异常作为原因。这可以归功于1-arg constructor of java.lang.Exception。自定义异常类型的典型实现(如您的DiffException)也声明了这样的1-arg构造函数。

答案 1 :(得分:4)

好吧,如果捕到的异常(我认为你的情况为e)是DiffException的子类型,你当然可以施放就像

throw (DiffException) e;

但我怀疑这是你想做什么,因为它没有什么区别(e仍然具有相同的运行时类型,即使在接收端也是如此。)

所以答案很有可能,没有,没有其他的,等效的做法

throw new DiffException(e);

而不是那样做。

但应注意,执行new DiffException(e)不是称为强制转换,而是包装,或链接异常。

答案 2 :(得分:0)

由于您提到了用例,Java中的常见用例是将已检查的异常包装为未选中;当没有办法检查异常时,这是合适的,例如:

public static Reader getUTF8Reader(InputStream is) {
    try {
        return new InputStreamReader(inputStream, "UTF-8");
    } catch(UnsupportedEncodingException e) {
        // should never happen since UTF-8 is guaranteed to be available as per
        // http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html
        throw new RuntimeException("UTF-8 not available", e);
    }
}

如果没有包装异常,你要么必须吞下它(感觉不对),要么将方法声明为throws UnsupportedEncodingException,强制任何人使用它来捕获永远不会被抛出的异常。包装它,调用者没有责任处理不太可能发生的情况,但我们受到保护,以防万一UTF-8在未来的某个模糊平台上不可用。

答案 3 :(得分:0)

如果我理解正确,这是我正在考虑的用例。 表达式:

new FileInputStream(“path”);

如果文件不存在,

可能会抛出FileNotFoundException()。 FileNotFoundException扩展了IOException,因此您可以编写如下代码:

public void readFromFile(String path){     InputStream in = new FileInputStream(path);     // 做一点事.... }

现在您可以按以下方式调用此方法:

尝试{     readFromFile( “MYFILE”); } catch(IOException e){     if(e instanceof FileNotFoundException){         FileNotFoundExceptio fnfe =(FileNotFoundException)e;         //做那么的事     }     //做点别的 }

但是我建议你为FileNotFoundException和IOException创建单独的catch块(至少对于这个用例):

尝试{     readFromFile( “MYFILE”); } catch(FileNotFoundException e){     //使用FileNotFoundException做一些事情 } catch(IOException e){     //使用IOException做一些事情 }

此代码不包含instanceof,cast和其他丑陋的东西。