说,我想防止在当前包裹内的任何地方除以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分区时也会这样做。
这可能吗?如果没有,请详细说明原因。这将有助于清除我的概念。
答案 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):
答案 2 :(得分:0)
要做到这一点,你必须修改java.lang.ArithmeticException
,如果他们知道你想让ArithmeticException
除以3,我相信当局不会让你这么做。