Java 使用连续stream.flatMap时无法在异常时停止

Java 使用连续stream.flatMap时无法在异常时停止,java,intellij-idea,java-8,java-stream,Java,Intellij Idea,Java 8,Java Stream,在IntelliJ IDEA中调试代码时,在某些情况下,当在流上使用连续的flatMap方法时,我不能在异常情况下停止。它不是在异常时停止,而是在API方法的第271行停止,帧堆栈根本不显示异常。下面是可能的最简单示例: import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class AssertTest { public static void main(

在IntelliJ IDEA中调试代码时,在某些情况下,当在流上使用连续的
flatMap
方法时,我不能在异常情况下停止。它不是在异常时停止,而是在API方法的第271行停止,帧堆栈根本不显示异常。下面是可能的最简单示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class AssertTest {
    public static void main(String[] args) {
        Arrays.asList(
            Arrays.asList(0, 0, 0),
            Arrays.asList(1, 1, 1),
            Arrays.asList(2, 2, 2)
        )
            .stream()
            .flatMap(a -> test1(a).stream())
            .flatMap(a -> test2(a).stream())
            .collect(Collectors.toSet());
    }
    private static List<List<Integer>> test1(List<Integer> ints) {
        return Arrays.asList(ints);
    }
    private static List<List<Integer>> test2(List<Integer> ints) {
        throw new RuntimeException();
    }
}

这是虫子吗?如果有,是否有提及?如果没有,我应该在哪里报告:Jetbrains,Oracle?或者这是正确的行为吗?

以下是我从一位Jetbrains开发者那里得到的答案,他报告了一个bug:

只有当我将任何异常断点设置为仅在未捕获的异常上停止时,我才能复制它,是这样吗

您的异常被捕获并在java中重新抛出,这是一个缺点 流:(您还需要在捕获到异常时停止,以便 能够在代码中停止


启用在捕获的异常处停止可以解决这一问题。

您尝试在测试方法中放置断点吗?@SotiriosDelimanolis如果您在
上放置断点,则抛出新的RuntimeException()
,那么是的,它在抛出异常之前会在该行停止,但在抛出异常之后,它仍然会在API方法内部停止。@Susei我建议先联系JetBrains,因为这涉及到调试器。如果调试器接口到JVM的信息缺失或不足,他们将能够确定d将信息转发给Oracle。您是否尝试过将main方法中的大单行拆分为多行?将数组列表分配给一个变量,分配stream()的结果然后用异常断点重试。是的,但我感兴趣的是看你是否在单行中遇到了同样的问题,显示这是否是一个较低的库的问题(根据你的回答似乎是这样),或者只是IntelliJ不喜欢带有闭包的流畅接口样式。
Exception in thread "main" java.lang.RuntimeException
    at mypkg.AssertTest.test2(AssertTest.java:23)
    at mypkg.AssertTest.lambda$main$1(AssertTest.java:16)
    at mypkg.AssertTest$$Lambda$2/14008398.apply(Unknown Source)
    at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:270)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    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 mypkg.AssertTest.main(AssertTest.java:17)