Java 空指针异常,尽管可选<&燃气轮机;
我有:Java 空指针异常,尽管可选<&燃气轮机;,java,optional,Java,Optional,我有: List<Optional<MyObject>> myList; 我有大约350k个MyObject文件要读取,300k文件可以很好地读取,但是当我尝试读取整批c.350k文件时,它会在collect()上引发空指针异常 尽管包装为Optional并检查Optional::isPresent、Optional::orElse等,但一个空对象仍然能够设法通过,并且鉴于我有如此大量的文件,那么尝试缩小错误文件范围的最佳方法是什么?谢谢 编辑:添加堆栈跟踪 Excep
List<Optional<MyObject>> myList;
我有大约350k个MyObject文件要读取,300k文件可以很好地读取,但是当我尝试读取整批c.350k文件时,它会在collect()上引发空指针异常
尽管包装为Optional并检查Optional::isPresent、Optional::orElse等,但一个空对象仍然能够设法通过,并且鉴于我有如此大量的文件,那么尝试缩小错误文件范围的最佳方法是什么?谢谢
编辑:添加堆栈跟踪
Exception in thread "main" java.lang.NullPointerException
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.mypackage.MyObject.main(MyObject.java:108)
Well可能是非null
MyObject
is null中的属性之一?您确实在执行筛选(可选::isPresent)
,但这并不意味着字段本身不是空的MyObject::getBookType
或MyObject::getBookPrice
很容易仍然为空 关于“尝试缩小错误文件范围的最佳方法是什么?”的问题,我通常在解析时使用以下模式:
for (File file : filesToParse) {
try {
parseFile(file);
} catch (IOException e) {
// rethrow the exception, and make sure that
// 1. you give the file in the message, to help narrow the error down
// 2. pass the original exception as 2nd parameter, to preserve the stack trace
throw new IOException("Failed to parse file: " + file, e);
}
}
你能发布堆栈跟踪吗?拥有一个选项列表已经很奇怪了,不存在的对象本来就不应该出现在列表中。即使可能有一个
MyObject
为空,也会收集那些20
(s)如果有一本真正的书(adventureBook
),价格是20
,那该怎么办?如果您(例如)将null
添加到该列表中而不是Optional.empty()
,则Optional
不会神奇地保护您免受NullPointerException
的影响。考虑到注释,我在将文件读取参数传递给MyObject构造函数之前进行了进一步的空检查,但问题仍然存在,堆栈跟踪对于注释来说太长,我正在将其编辑到OP.@shanlodhMyObject
的第108行是什么?它是.collect()在OPC中提到,我提到的350k文件分布在c.15k文件夹中,在一些文件夹中似乎有一些非.gz2文件破坏了org.apache.commons.compress.compressor.*我使用的反序列化程序。使用实现FileNameFilter的助手类解决了这个问题。谢谢大家again@shanlodh你知道这和问题本身毫无关系,对吧?很好,我想你已经解决了,下次我会提供所有需要的细节。你不应该捕获所有运行时异常,只捕获你感兴趣的异常,比如IOException
。捕获所有内容只能作为main
应用程序的超级包装器来完成,并且只能用于日志记录。我的理解是,无论如何都不应该捕获特定的运行时异常,因此我认为抛出不同的运行时异常没有问题,并提供了更多细节来帮助调试。例如,见IOException
不是运行时异常,因此如果抛出,需要进行不同的处理。@Zabuza您建议的解决方案是什么?仅捕获IOException
。让其余的通过。如果你真的想抓住一切,你也需要包括错误。因此,Throwable
而不是RuntimeException
。尽管人们是否应该在错误上携带RuntimeException
,比如illegalstateeption
,这是值得怀疑的。@Zabuza像这样吗?
for (File file : filesToParse) {
try {
parseFile(file);
} catch (IOException e) {
// rethrow the exception, and make sure that
// 1. you give the file in the message, to help narrow the error down
// 2. pass the original exception as 2nd parameter, to preserve the stack trace
throw new IOException("Failed to parse file: " + file, e);
}
}