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

时间:2016-05-27 22:14:22

标签: java exception runtimeexception

说,我想防止在当前包裹内的任何地方除以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分区时也会这样做。

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

3 个答案:

答案 0 :(得分:4)

我不认为这是微不足道的。

你希望5 / 3抛出异常,对吗?与5 / 0相同?根据{{​​3}},“在Unix环境中,通过SIGFPE发信号通知除零,JVM将安装一个信号处理程序,它捕获SIGFPE并反过来抛出ArithmeticException。”

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

另见

答案 1 :(得分:0)

如果没有明确地抛出它,就无法抛出Exception。除了一些内部Exceptions,比如除以0,它们由JVM处理。这些包括NullPointerException,如果没有被显式throw语句抛出,除以0和其他一些错误。但这些异常实际上是通过从底层平台接收错误而创建的。例如。在除以0的情况下,CPU已经生成了错误。

因此,除非您的代码以某种方式在底层平台中创建错误,否则您必须自己创建错误。任何其他东西都需要JVM高度可变,由于行为不一致而没有多大意义,这是不可取的,并且导致极端的安全风险。作为一个例子,为什么不宜使JVM成为可能的: 考虑一下你的例子:

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

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

答案 2 :(得分:0)

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