我想知道 javac 是如何计算这个常量表达式的?
class Test {
public static final int NaN = 0 / 0;
...
它在Java 语言规范 §15.17.2中定义:
有一种特殊情况不满足此规则:如果被除数是其类型的最大可能量级的负整数,并且除数为-1,则发生整数溢出并且结果等于被除数。尽管溢出,在这种情况下不会抛出异常。另一方面,如果整数除法中除数的值为0,则
ArithmeticException
抛出an。
这意味着什么:如果被除数为 0,那么除数是什么并不重要;它会直接抛出ArithmeticException
。
现在,如果您使用的是doublesNaN
,那将通过JLS §15.17.2给您回报。
Java 的整数原始类型中没有“NaN”或“Inf”值的表示。(或者在大多数其他语言中。)
实际发生的是 anArithmeticException
将被抛出......在运行时。
由于这个表达式是在类的静态初始化中求值的,初始化类将失败,任何其他依赖于它的类也将初始化失败。很有可能您的应用程序甚至不会进入该main
方法的第一个语句。