我想在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());
}
}
}
答案 0 :(得分:3)
简单的答案:你不能。
更复杂的答案:你做不到,你真的不应该这样做。主要原因是,如果您的代码可以捕获未公布的异常,则会导致不一致和错误。
最重要的是,该代码块并不意味着捕获其他而不是IOException
;也就是说,代码只是为了在IO上乱七八糟的东西上恢复。如果我尝试捕获其他任何内容,那么这意味着代码知道如何从该场景中恢复,这非常不的情况。
顺便说一句,任何IOException 的子项都将被该块捕获,因此您不必担心捕获FileNotFoundExecption
,因为它会处理它。
答案 1 :(得分:0)
这是糟糕的编码,我只是写它感觉很脏......
而不是catch
直接IOException
,您可以检查被抓住的Exception
是IOException
。
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());
}
}
}
}