投掷例外没有"投掷"对于任何类型的例外

时间:2016-01-10 08:06:05

标签: java exception

我想在Java中抛出异常(任何类型),但限制是我无法添加"抛出异常"我的主要方法。所以我试过这个:

import java.io.IOException;

class Util
{
    @SuppressWarnings("unchecked")
    private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T
    {
        throw (T) exception;
    }

    public static void throwException(Throwable exception)
    {
        Util.<RuntimeException>throwException(exception, null);
    }
}

public class Test
{
    public static void met() {
        Util.throwException(new IOException("This is an exception!"));  
    }

    public static void main(String[] args)
    {
        System.out.println("->main");
        try {
            Test.met();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

这段代码有效,但是当我试图捕获&#34; IOException&#34;,例如,在try-catch块中,它没有编译。编译器告诉我从不抛出IOException。它仅适用于扩展RuntimeException的异常。有办法解决这个问题吗?

添加了:

import java.io.IOException;

class Util
{
    @SuppressWarnings("unchecked")
    private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T
    {
        throw (T) exception;
    }

    public static void throwException(Throwable exception)
    {
        Util.<RuntimeException>throwException(exception, null);
    }
}

public class Test
{
    public static void met() { // this method's signature can't be changed
        Util.throwException(new IOException("This is an exception!"));  
    }

    public static void main(String[] args)
    {
        System.out.println("->main");
        try {
            Test.met();
        } catch (IOException e) { // can't be changed and it does not compile right now
            System.out.println(e.getMessage());

        }
    }
}

2 个答案:

答案 0 :(得分:3)

简单的答案:你不能。

更复杂的答案:你做不到,你真的不应该这样做。主要原因是,如果您的代码可以捕获未公布的异常,则会导致不一致和错误。

最重要的是,该代码块并不意味着捕获其他而不是IOException;也就是说,代码只是为了在IO上乱七八糟的东西上恢复。如果我尝试捕获其他任何内容,那么这意味着代码知道如何从该场景中恢复,这非常的情况。

顺便说一句,任何IOException 的子项都将被该块捕获,因此您不必担心捕获FileNotFoundExecption,因为它会处理它。

答案 1 :(得分:0)

这是糟糕的编码,我只是写它感觉很脏......

而不是catch直接IOException,您可以检查被抓住的ExceptionIOException

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("->main");
        try {
            Test.met();
        } catch (Exception e) {
            if (e instanceof IOException) {
                System.out.println(e.getMessage());
            }
        }
    }
}