当前位置: 首页 > 面试题库 >

1/0是合法的Java表达式吗?

宰父飞翼
2023-03-14
问题内容

以下在我的Eclipse中可以正常编译:

final int j = 1/0;
// compiles fine!!!
// throws ArithmeticException: / by zero at run-time

Java甚至一开始就阻止了许多“愚蠢的代码”的编译(例如"Five" instanceof Number,没有编译!),所以它甚至没有产生像警告一样多的事实,这令我感到非常惊讶。当您考虑允许在编译时优化常量表达式这一事实时,这种兴趣就加深了:

public class Div0 {
    public static void main(String[] args) {
        final int i = 2+3;
        final int j = 1/0;
        final int k = 9/2;
    }
}

上面的代码段在Eclipse中编译,生成了以下字节码(javap -c Div0

Compiled from "Div0.java"
public class Div0 extends java.lang.Object{
public Div0();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_5
   1:   istore_1      // "i = 5;"
   2:   iconst_1
   3:   iconst_0
   4:   idiv
   5:   istore_2      // "j = 1/0;"
   6:   iconst_4
   7:   istore_3      // "k = 4;"
   8:   return

}

如您所见,ik分配被优化为编译时常量,但是除法0(必须在编译时可检测到)被简单地按原样编译。

javac 1.6.0_17它的行为甚至更奇怪,它会静默地编译,但会删除字节码中的分配,i并将其k完全从字节码中删除(可能是因为它确定未在任何地方使用它们),但保持1/0原样(因为删除它会导致完全不同的程序语义)。

所以问题是:

  • 1/0实际上应该编译随时随地法律Java表达式?
    • JLS对此有何评论?
  • 如果这是合法的,那么有充分的理由吗?
    • 这可能有什么好处?

问题答案:

1/0实际上应该编译随时随地法律Java表达式

是。

JLS对此有何评论?

除了说被零除会导致运行时异常外,没有什么特别的。但是,JLS在以下定义中承认存在运行时异常的可能性:

“编译时常量表达式是表示原始类型或String的值的表达式,该值 不会突然完成, 并且仅使用以下内容组成:…”

(添加了强调。)因此以下内容将无法编译:

switch(i) {
    case 1:
    case 1 + 1: 
    case 1 / 0:  // compilation error.
}

如果这是合法的,那么有充分的理由吗?

好问题。我想这是一种抛出的方式,ArithmeticException尽管这几乎不是合理的理由。用这种方式指定Java的更可能的原因是避免JLS和编译器处理不必要的情况而造成不必要的复杂性。

但这一切都是靠。事实是,这1/0是有效的Java代码,并且任何Java编译器都不应将其标记为编译错误。(如果有编译器开关将其关闭,则对于Java编译器发出警告是合理的。)



 类似资料:
  • 我有一个调度程序作业,我已经将配置为cron表达式,每半n小时运行一次,但是调度程序没有被触发,相反,如果我像那样每5分钟设置一次表达式,它就可以正常工作。这里可能有什么问题?我的cron表达式正确吗? 注意:我正在使用Quartz调度器(Java)并在数据库调度器表中创建一个条目。

  • 问题内容: 我需要寻找java regex模式,该模式以1 = 1的格式查找输入字符串,其中前缀“ =”应具有与后缀相同的位数。同样,这里的前缀和后缀值应相同,例如1 = 1、11 = 11、223 = 223。像1 = 2、3 = 22、33 = 22之类的值不应与模式匹配 我们能否有一个满足上述规则的一般模式。 问题答案: 使用反向引用: 当然,在Java中,您需要转义反斜杠:

  • N4527 5.20【expr.const】p5 常量表达式是glvalue核心常量表达式,其值是指常量表达式(定义如下)的允许结果实体,或者是prvalue核心常量表达式,其值是对象,其中,对于该对象及其子对象: -引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,并且 -如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象结尾的地址(5.7)

  • 为什么我会得到:非法的表达式开始-公共静态int noOfLetters(String str){error?我如何修复它?

  • 问题内容: 我正在写一些帮助程序来帮助生成一些非常特定于域的sql。在我的测试套件中,最好添加一个健全性检查以确保结果实际上是有效的SQL。我没有做任何特别花哨的事情,而且这不是生产代码,所以我认为可以使用一些正则表达式,但是手工编写仍然很烦人。 是否有人愿意共享至少在90%的情况下可以验证有效SQL的正则表达式? 问题答案: SQL不是常规语言。使用真实的验证器,例如Mimer。

  • 序:世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关注的数据,此时可以通过一些表达式进行提取,正则表达式就是其中一种进行数据筛选的表达式。 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。 正则表达式通常被用来匹配、检索、替换和分割那些符合某个模式(规则)的文本。 Python 自1.5版本起