这个 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)
不会评估表达式 b
是 a == false
。
【参考方案1】:
假设我们包含 SoP 的导入,并且这些行写入静态 main 中,不会抛出异常,并且将打印 s2
。
X/0
永远不会在您的代码中被评估,因为 && 先检查左表达式,因此它永远不会抛出任何东西。
【讨论】:
我不同意。如果int n
被声明为字段而不是本地参数,并且这部分代码由多个线程执行并且其中一个线程将n
分配给0
,则可能会抛出异常。
“如果”。确切地说,我只是基于我对 Op 给出的代码的回答。在任何 Java 环境中,这些代码行都不会抛出异常。假设当然给出了 SoP 的导入。我不记得 op 谈论多线程
我们无法确定这一点。否则,代码将发布在方法中。我们可以假设任何事情,因此帖子也可能因过于宽泛而被关闭。
严格意义上你是对的。但我在回答中假设 1. 给出了导入 2. 这段代码写在一个主类和一个类中。我会更正我的答案以包括这两个假设。感谢您指出灰色区域 Luiggi【参考方案2】:
来自JLS §15.23:
条件与运算符 && 类似于 &(第 15.22.2 节),但仅当其左侧操作数的值为 true 时才计算其右侧操作数。
所以不,你不会得到异常。
显然,这假设您有一个单线程或线程安全的环境 - 如果您在混合中引入可见性问题,那么这是任何人的猜测。
【讨论】:
以上是关于这个 if 语句会抛出异常还是忽略它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章