Java: 如何在不使用 throw 语句的情况下抛出自定义运行时异常?

Java: How to throw a custom Runtime Exception without using a throw statement?

比如说,我想防止在当前包中的任何地方被除以 3。通常的程序是创建一个 Exception 子类:

class NoDivbyThreeException extends RuntimeException {
    public NoDivbyThreeException (String msg) {
        super(msg);
    }
}

然后把它扔到需要的地方:

class CustomExceptionDemo {
    public static void main(String[] args) {
        int numr = 5;
        int denr = 3;
        try {
            if (denr==3) throw new NoDivbyThreeException("Div by 3 not allowed");
            else System.out.println("Result: " + numr/denr);
        }
        catch (NoDivbyThreeException e) {
            System.out.println(e);
        }
     }
}

但我想要的是 JVM 应该防止在这个包内的任何地方被 3 除,而无需我在 main() 内明确声明 throw 语句。换句话说,JVM 通过在遇到这种情况时自动抛出异常来防止被零除的方式,我希望我的程序在包内遇到被 3 除的情况时也这样做。

这可能吗?如果不是,请详细说明原因。这将有助于理清我的概念。

我认为这不太可能。

你希望5 / 3抛出异常,对吧?和5 / 0一样吗?根据this answer、"In an Unix environment, in which division-by-zero is signalled via SIGFPE, the JVM will have installed a signal handler which traps the SIGFPE and in turn throws an ArithmeticException."

换句话说,由5 / 0引起的错误不是从JVM开始的,而是从CPU或Java之外的内核开始的。您无法让 CPU 或内核在除以 3 时抛出异常,并且您无法覆盖 Java.

中的除法行为

另见

如果不显式地抛出 Exception,就无法抛出它。除了一些内部 Exceptions,例如除以 0,它们由 JVM 处理。这些包括 NullPointerException,如果不是由显式 throw-statement 抛出,除以 0 和其他一些错误。但这些异常实际上是通过从底层平台接收到错误而创建的。例如。在 division-by-0 的情况下,错误已经由 CPU.

生成

因此,除非您的代码以某种方式在底层平台中产生错误,否则您将不得不自己产生错误。其他任何东西都需要 JVM 是高度可变的,由于行为不一致,这没有多大意义,这是不可取的,并导致极端 security-risk。作为为什么不希望使 JVM 可变的示例:
考虑你的例子:

我们可以有三个选项来处理这个问题(none 存在,AFAIK):

  • 更改编译器中的代码,如果发生被三除(可能)的情况,则抛出异常。缺点:膨胀代码
  • 改变 JVM 的行为:更不可取。考虑一个库,它会抛出除以 3 的异常。现在你想在你的代码中使用这个库。但是您期望正常的算术行为并在除以 3 时得到一些奇怪的错误。
  • 向描述 JVM 预期行为的库添加 header。与第一个选项相比,只有负载从编译和内存移动到 运行 时间和 startup/on 运行 编译。

要做到这一点,你必须修改 java.lang.ArithmeticException ,我相信如果当局知道你想将 ArithmeticException 除以 3,他们不会让你这样做 :) .