Java:引发异常后程序未崩溃

Java:引发异常后程序未崩溃,java,exception-handling,Java,Exception Handling,我在while循环的每次迭代中都会进行异常处理。由于某些原因,当引发异常的条件为true时,将显示异常消息,但程序将保持运行而不中断。我以前从未见过这种情况,我怀疑这是因为while循环。我必须在每次迭代中检查队列中是否存在空对象,所以我将代码改为使用try子句,但仍然得到相同的结果。将引发异常,但程序不会崩溃。这是什么原因造成的 Purchase ownedShares; while (numSharesToSell > 0) { try { ownedShares = q

我在while循环的每次迭代中都会进行异常处理。由于某些原因,当引发异常的条件为true时,将显示异常消息,但程序将保持运行而不中断。我以前从未见过这种情况,我怀疑这是因为while循环。我必须在每次迭代中检查队列中是否存在空对象,所以我将代码改为使用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块中,它可以防止我抛出的任何错误导致程序崩溃。这让我得出结论,给我这个代码的骨架类的人不希望异常使程序崩溃

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


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

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


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

如果
numSharesToSell
大于0,则看起来您有一个无限循环,除非您遗漏了更新
numSharesToSell
@nem的部分-不正确
q
为空和
q
为空是两件截然不同的事情。如果
q
为空,
ownedshares
将为空,则此行不会抛出NPE。只有当
q
为空时才会抛出NPE。@drewmoore我意识到我误解了他并更新了comment@nem,只需使用isEmpty()进行尝试并发布结果。同样的事情如果你抛出一个异常,循环就不可能继续。我敢打赌,您在向我们展示的代码中遗漏了一些重要的内容,或者您误解了一些内容。异常也并不总是使程序崩溃。有可能它被捕获在您看不到的更高位置,或者应用程序是多线程的,只有工作线程死亡。如果
numSharesToSell
大于0,则看起来您有一个无限循环,除非您遗漏了更新
numSharesToSell
@nem的部分-不正确
q
为空和
q
为空是两件截然不同的事情。如果
q
为空,
ownedshares
将为空,则此行不会抛出NPE。只有当
q
为空时才会抛出NPE。@drewmoore我意识到我误解了他并更新了comment@nem,只需使用isEmpty()进行尝试并发布结果。同样的事情如果你抛出一个异常,循环就不可能继续。我敢打赌,您在向我们展示的代码中遗漏了一些重要的内容,或者您误解了一些内容。异常也并不总是使程序崩溃。它可能被捕获在您看不到的更高位置,或者应用程序是多线程的,只有工作线程死亡。