有没有办法在不添加 throw 语句的情况下引发异常?

2022-08-31 11:19:57

我有以下情况。

我有一个从另一个基类继承并重写方法的Java类。基方法不引发异常,因此没有声明。throws ...

现在我自己的方法应该能够抛出异常,但我可以选择

  • 吞下异常或
  • 添加抛出声明

两者都不令人满意,因为第一个会默默地忽略异常(好吧,我可以执行一些日志记录),第二个会因为不同的方法头而生成编译器错误。

public class ChildClass extends BaseClass {

        @Override 
        public void SomeMethod() {
            throw new Exception("Something went wrong");
        }
}

答案 1

如果确实需要,可以引发未经检查的异常,而不必声明它们。未选中的例外扩展了 。扩展的可抛出项也未选中,但应仅用于完全无法处理的问题(例如无效字节码或内存不足)。RuntimeExceptionError

作为一个具体案例,Java 8添加了UncheckEDIOException用于包装和重新抛出。IOException


答案 2

这是一个技巧:

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

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

public class Test
{
    public static void main(String[] args)
    {
        Utils.throwException(new Exception("This is an exception!"));
    }
}