Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空指针异常,尽管可选<&燃气轮机;_Java_Optional - Fatal编程技术网

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.@shanlodh
MyObject
的第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);
    }
}