【问题标题】:Java exception for a too big array数组太大的 Java 异常
【发布时间】:2018-01-30 22:19:50
【问题描述】:

我从 C(即来自 JNI/JNA)收到一个 long 值。我想创建一个该大小的byte[] 数组。

如果这个值超过了数组的最大大小,我应该抛出什么异常?

换句话说,我应该在下面抛出哪个异常?

long output_len;
...
if(output_len > Integer.MAX_VALUE)
    throw new ...();

【问题讨论】:

标签: java arrays exception runtime-error out-of-memory


【解决方案1】:

Java 本身会抛出 OutOfMemeryError 以防尝试将太大的整数分配给数组的大小,但是 - 正如 @StephenC​​trong> 所建议的 - 你不应该让你的代码抛出这种错误。您应该考虑创建自己的Exception 类并在其主体中提供特定消息,因为您决定在output_len > Integer.MAX_VALUE 的情况下抛出异常。 IllegalArgumentException 似乎也是一个好主意,但值得考虑提供一个具体的消息来描述为什么会抛出这个 Exception

【讨论】:

  • 程序不应该抛出 OOMEs ... 除非您不希望调用者捕获它们。 OOME 是Error,应被视为致命错误。用Error 表示(可能)可恢复的错误条件是错误的。
  • @StephenC 所以如果我没有误解你的话,在创建自己的类、构造函数和方法时,应该不可能抛出这样的错误吗?所以我认为没有适合 OP 提出的案例的异常(除了他自己的异常) - 也许是 IllegalArgumentException,但我认为它实际上并不那么准确。你怎么看?
  • @StephenC 我不同意。 new xxx[output_len] 失败的逻辑原因有 3 个:1) 可用内存不足,2) 超出 VM 限制,3) output_len 的值超出 int 范围。前两个抛出OutOfMemoryError。为什么#3 的错误应该不同?这实际上是同一个问题:你要求的比能做的还多。当然,描述(message)应该说明原因,但错误是一样的。
  • 不完全是。我要说的是,你永远不应该设计一个需要调用者来捕获Error 的API。 IllegalArgumentException 是一个合理的选择,IMO。如果 OP 需要特定的东西,他可以声明自己的自定义异常。
  • @Andreas 当然,我不像你们两个那样有经验,但我认为您的示例中的 1) 和 2) 与将提供的代码相当独立(这取决于内部VM 或内存中的东西),当 3)更依赖于类设计者的意图时——他自己决定这个数组的大小是不合适的——所以我不确定 Error 是否是处理这个问题的正确方法.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多