Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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 8-关闭异常流?_Java_Exception Handling_Lambda_Java 8 - Fatal编程技术网

Java 8-关闭异常流?

Java 8-关闭异常流?,java,exception-handling,lambda,java-8,Java,Exception Handling,Lambda,Java 8,如果在调用构建流链的任何元素期间发生异常,是否有关闭流的方法 例如,代码: Stream.of(new Object()) .filter(e -> { if (true) throw new IllegalStateException(); return true; }) .onClose(() -> System.out.println(

如果在调用构建流链的任何元素期间发生异常,是否有关闭流的方法

例如,代码:

    Stream.of(new Object())
            .filter(e -> {
                if (true) throw new IllegalStateException();
                return true;
            })
            .onClose(() -> System.out.println("OnClose"))
            .collect(Collectors.toList());
将产生以下输出:

Exception in thread "main" java.lang.IllegalStateException
at my.className.lambda$main$2(LdapRealm.java:114)
at my.className$$Lambda$1/1607521710.test(Unknown Source)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
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 my.className.main(LdapRealm.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

请注意,“OnClose”消息未打印,因为尚未调用OnClose()。如果我希望第三方代码使用此流,并且我不确定该代码是否会促进
try/catch
+
Autocloseable
功能,那么有没有解决此问题的好方法?

如果您的类用户不使用try/finally或try with resources,您完全无法进行清理。(终结器除外,它不是一个好的解决方案。)

如果您有一个返回流的函数

Stream<Object> getStream() {
    return Stream.of(new Object())
        .filter(e -> {
            if (true) throw new IllegalStateException();
            return true;
        })
        .onClose(() -> System.out.println("OnClose"));
}
Stream getStream(){
返回流.of(新对象())
.过滤器(e->{
if(true)抛出新的非法状态异常();
返回true;
})
.onClose(()->System.out.println(“onClose”);
}
那么这个函数的正确用法是

List<Object> result;
try (Stream<Object> s = getStream()) {
    result = s.collect(Collectors.toList());
}
列表结果;
尝试(streams=getStream()){
结果=s.collect(Collectors.toList());
}

由于
基流
的一个子类,并且
基流
扩展了
自动关闭
,您应该能够使用
try with resource
模式。

似乎没有其他事情可做,谢谢您的回复。