【发布时间】:2014-10-20 23:54:53
【问题描述】:
我对 while 循环的每次迭代都进行了异常处理。由于某种原因,当抛出异常的条件为真时,会显示异常消息,但程序会继续运行而不会中断。我以前从未见过这种情况,并怀疑这是因为 while 循环。我必须在每次迭代时检查队列中是否存在空对象。 Another thread suggested using a try clause,所以我将代码更改为使用 try 子句,但我仍然得到同样的结果。抛出异常,但程序不会崩溃。这是什么原因造成的?
Purchase ownedShares;
while (numSharesToSell > 0) {
try {
ownedShares = q.peek();
}
catch(NullPointerException ex) {
throw new IllegalArgumentException("Not enough shares");
}
编辑 2:
使用 isEmpty() 也不起作用:
Purchase ownedShares;
while (numSharesToSell > 0) {
if (q.isEmpty())
throw new IllegalArgumentException("Not enough shares");
else
ownedShares = q.peek();
// try {
这里的核心错误不是异常没有被执行。它正在执行,并且正在打印消息“没有足够的份额”。问题是当发生这种情况时程序不会停止。外循环继续。
编辑 3:
我正在修改的方法调用包含在一个 try/catch 块中,它可以防止我抛出的任何错误导致程序崩溃。这让我得出结论,为我提供此代码的骨架类的人不希望异常使程序崩溃。
【问题讨论】:
-
如果
numSharesToSell大于 0,看起来你有一个无限循环,除非你遗漏了更新numSharesToSell的部分 -
@nem - 不正确。
q为 null 和q为空是两个非常不同的东西。如果q为空,此行不会抛出 NPE,ownedshares将只是空。只有当q为 null 时才会抛出 NPE。 -
@drewmoore 我意识到我误解了他并更新了评论
-
@nem,刚刚用 isEmpty() 尝试过并发布了结果。一样的
-
如果您从中抛出异常,循环将无法继续。我敢打赌,您在向我们展示的代码中遗漏了一些重要的东西,或者误解了一些东西。异常也不总是使程序崩溃。有可能它被捕获在您看不到的更高位置,或者应用程序是多线程的,只有工作线程死亡。