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.
中的除法行为
另见
- How does Java handle division by zero?
- SIGFPE
idiv
JVM instruction set code
如果不显式地抛出 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,他们不会让你这样做 :) .
比如说,我想防止在当前包中的任何地方被除以 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.
另见
- How does Java handle division by zero?
- SIGFPE
idiv
JVM instruction set code
如果不显式地抛出 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,他们不会让你这样做 :) .