【问题标题】:Java: Program not crashing after throwing exceptionJava:抛出异常后程序不会崩溃
【发布时间】: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() 尝试过并发布了结果。一样的
  • 如果您从中抛出异常,循环将无法继续。我敢打赌,您在向我们展示的代码中遗漏了一些重要的东西,或者误解了一些东西。异常也不总是使程序崩溃。有可能它被捕获在您看不到的更高位置,或者应用程序是多线程的,只有工作线程死亡。

标签: java exception-handling


【解决方案1】:

如果正在打印异常消息但程序没有崩溃,这意味着调用堆栈上方的代码正在捕获该异常,打印其消息,然后吞下它。也就是说,某处的调用者中有一个try-catch 块。

您应该使用调试器中断循环并查看调用堆栈,然后检查所有调用函数的代码以找到try-catch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多