Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8275233

Incorrect line number reported in exception stack trace thrown from a lambda expression

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: 17
    • Fix Version/s: 18
    • Component/s: tools
    • Labels:
      None
    • Subcomponent:
    • Resolved In Build:
      b27

      Backports

        Description

        Consider the following class:
        ================================================
        import java.util.stream.LongStream;

        public class TestLambdas {
            public static void main(String[] args) {
                new TestLambdas().execute(0, 5);
            }

            public boolean assertLong(long l, long forbidden) {
                if (l == forbidden) {
                    throw new AssertionError(forbidden);
                }
                return true;
            }

            public boolean assertLong2(long l, long forbidden) {
                if (l == forbidden) {
                    throw new AssertionError(forbidden);
                }
                return true;
            }

            public void execute(long first, long last) {
                for (int i = 0; i < 1000; i++) {
                    long forbidden = 4 + i;
                    System.out.println("first");
                    LongStream.range(first, 4).forEachOrdered((l) ->
                            assertLong(l, forbidden)
                    );
                    System.out.println("Second");
                    LongStream.range(first, last).forEachOrdered((l) ->
                            assertLong(l, forbidden)
                    );
                    System.out.println("Done");
                }
            }
        }
        ================================================
        An exception should be raised by the second lambda invocation, at line 31.

        But the exception that gets printed says that it happened at line 27, which is not possible:

        Exception in thread "main" java.lang.AssertionError: 4
        at TestLambdas.assertLong(TestLambdas.java:10)
        at TestLambdas.lambda$execute$0(TestLambdas.java:27)
        at java.base/java.util.stream.Streams$RangeLongSpliterator.forEachRemaining(Streams.java:228)
        at java.base/java.util.stream.LongPipeline$Head.forEachOrdered(LongPipeline.java:610)
        at TestLambdas.execute(TestLambdas.java:30)
        at TestLambdas.main(TestLambdas.java:5)

        If run in the IDE instead the same code reports the correct location:

        Exception in thread "main" java.lang.AssertionError: 4
        at TestLambdas.assertLong(TestLambdas.java:10)
        at TestLambdas.lambda$execute$1(TestLambdas.java:31)
        at java.base/java.util.stream.Streams$RangeLongSpliterator.forEachRemaining(Streams.java:228)
        at java.base/java.util.stream.LongPipeline$Head.forEachOrdered(LongPipeline.java:610)
        at TestLambdas.execute(TestLambdas.java:30)
        at TestLambdas.main(TestLambdas.java:5)

          Attachments

            Issue Links

              Activity

                People

                Assignee:
                cushon Liam Miller-Cushon
                Reporter:
                dfuchs Daniel Fuchs
                Votes:
                0 Vote for this issue
                Watchers:
                6 Start watching this issue

                  Dates

                  Created:
                  Updated:
                  Resolved: