我应该从应用程序本机库(通过JNI使用)抛出java.lang.OutOfMemoryError吗?

use*_*701 3 java java-native-interface out-of-memory

我正在设计一个解决方案,其中包括一个C++库和几个通过JNI使用该库的Java应用程序.

C++库大量分配本机内存.当分配失败时,可以从C++代码中检测到.分配失败应报告给Java代码,抛出一些东西.

考虑了两个选项:

  1. 从我的C++代码中抛出java.lang.OutOfMemoryError
  2. 添加mylibrary.MyLibraryOutOfMemoryError(扩展java.lang.RuntimeException或java.lang.Error),然后抛出它

什么是正确的选择,为什么?

par*_*fal 5

OutOfMemoryError 具有特定含义:

当Java虚拟机因内存不足而无法分配对象时抛出,并且垃圾收集器不再提供更多内存

由于本机堆分配失败,因此您的代码抛出此错误是不合适的.尽管如此ByteBuffer.allocateDirect().

我建议你创建自己的例外,扩展Error.它应该不会是一个检查的异常,因为很少有/没有一个运行的程序可以做些什么来避免错误.