这个 if 语句会抛出异常还是忽略它? [复制]

Posted

技术标签:

【中文标题】这个 if 语句会抛出异常还是忽略它? [复制]【英文标题】:Will this if statement throw an exception or ignore it? [duplicate] 【发布时间】:2015-06-30 09:01:03 【问题描述】:

由于第一部分的计算结果为假,这段代码是否不会计算 if 语句的除以零部分?如果是这样,是否适用于所有 Java IDE 中的所有情况?或者某些编译器会抛出异常?

int n = 0;
int x = 5;
if (n != 0 && x / n > 100) 
    System.out.println(" s1");
 else 
    System.out.println("s2");

【问题讨论】:

所有(正确的)Java 编译器和 JVM 都将以相同的方式运行它。至于它会做什么......为什么不自己试试看呢? Java 使用 short circuit evaluation 进行布尔运算。仅评估所需的数量。这是JLS 15.23强制 糟糕,由于错误的欺骗原因关闭了这个。让我试着找到一个更好的...... @BoristheSpider 我不认为这是一个短路评估问题。如果你声明 final int n = 0; 会是这样,但事实并非如此。 @LuiggiMendoza 我不明白:if(a && b) 不会评估表达式 ba == false 【参考方案1】:

假设我们包含 SoP 的导入,并且这些行写入静态 main 中,不会抛出异常,并且将打印 s2X/0 永远不会在您的代码中被评估,因为 && 先检查左表达式,因此它永远不会抛出任何东西。

【讨论】:

我不同意。如果int n被声明为字段而不是本地参数,并且这部分代码由多个线程执行并且其中一个线程将n分配给0,则可能会抛出异常。 “如果”。确切地说,我只是基于我对 Op 给出的代码的回答。在任何 Java 环境中,这些代码行都不会抛出异常。假设当然给出了 SoP 的导入。我不记得 op 谈论多线程 我们无法确定这一点。否则,代码将发布在方法中。我们可以假设任何事情,因此帖子也可能因过于宽泛而被关闭。 严格意义上你是对的。但我在回答中假设 1. 给出了导入 2. 这段代码写在一个主类和一个类中。我会更正我的答案以包括这两个假设。感谢您指出灰色区域 Luiggi【参考方案2】:

来自JLS §15.23:

条件与运算符 && 类似于 &(第 15.22.2 节),但仅当其左侧操作数的值为 true 时才计算其右侧操作数。

所以不,你不会得到异常。

显然,这假设您有一个单线程或线程安全的环境 - 如果您在混合中引入可见性问题,那么这是任何人的猜测。

【讨论】:

以上是关于这个 if 语句会抛出异常还是忽略它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java基础(12)---异常

JAVA-throw,throws以及内部类

如何在 lambda 表达式中重新抛出异常? [复制]

HttpClient 可以抛出哪些异常?

如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?

try-catch和throw,throws的区别