【问题标题】:Priority between OutOfMemoryError and Exception [duplicate]OutOfMemoryError 和异常之间的优先级 [重复]
【发布时间】:2017-07-01 04:31:55
【问题描述】:

我想问一下哪个catch块会先被调用,以防类似

的语句
try {
  ...some statement...
} catch (Exception ex) {
  System.out.println("out of memory exception");
} catch (OutOfMemoryError error) {
  System.out.println("out of memory error");
}

here 语句导致OutOfMemoryError。 我已经检查了Order of catching exceptions in Java

这是不同的,如果代码无缝运行,您无法预测会出现RunTimeException

【问题讨论】:

  • 异常和错误是正交的(它们有一个共同的超类型,但一个不是另一个的超类型)。抛出异常则捕获异常,抛出错误则捕获错误。
  • 如果内存不足,OutOfMemoryError catch 块将在应用程序崩溃时执行
  • @EJP 你的重复只关注异常,这个问题略有不同(异常与错误)。 (是的,它可能在其他地方仍然是重复的;)但不是这个)
  • @JeroenvanDijk-Jun 无论您选择哪一对Throwables,问题都是完全相同的。如果有继承关系,编译器会强制执行,否则没有问题解决。
  • @EJP 好吧......是的......但是......对于可抛出的兄弟姐妹来说,答案并不是那么清晰,而仅适用于异常兄弟姐妹。经验不足的人可能会发现这对于理解异常与错误很有用。

标签: java android exception error-handling


【解决方案1】:

请记住对象层次结构:

  • Java.lang.Throwable
    • Java.lang.Exception
    • Java.lang.Error

如果出现问题,要么是错误,要么是异常。这里没有第一个,因为这些类是兄弟,而不是父/子。

【讨论】:

  • 在我的例子中,我只使用Exception来关闭强制应用程序。
【解决方案2】:

java.lang.Exception 和 java.lang.Error(OutOfMemory is an Error) 对于它们的共同父 Throwable,彼此之间的异常无关。所以这里没有第一或第二。

OutOfMemory 发生在你的 jvm 快死(堆满)时,这种情况很少见,所以只需在其中进行清理工作。

【讨论】:

  • '很少"?`OutOfMemory'总是在你的堆满时发生。
  • 你的 jvm 很少会出现内存不足的情况,但是当它出现时,它肯定会抛出 OutOfMemory 错误
  • 这不是你的回答中所说的。
  • @EJB 如果在我的情况下声明强制 jvm 抛出 OutOfMemoryError 会发生什么?
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多