如何在Java堆栈跟踪中获取行的列号

Phi*_*ret 6 java stack-trace

在某些语言中,可以在堆栈跟踪中获取行的列号,但在Java中,我们只有行号.

举个例子,我们可以用另一种语言:

Error
    at <anonymous>:2:2
    at Object.InjectedScript._evaluateOn (<anonymous>:641:39)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:580:52)
    at Object.InjectedScript.evaluate (<anonymous>:495:21)"
Run Code Online (Sandbox Code Playgroud)

虽然这可能是一个糟糕的例子,因为我从浏览器控制台导致错误,您可以看到列号,这对解决错误非常有帮助.

给你一个Java示例(是的,名称已更改):

Caused by: java.lang.IllegalArgumentException: path was null
    at org.jboss.resteasy.specimpl.ResteasyUriBuilder.path(ResteasyUriBuilder.java:362)
    at enterprise.money.service(AbstractSomething.java:88)
Run Code Online (Sandbox Code Playgroud)

这导致88包含的线

URI uri = uriInfo.getBaseUriBuilder().path(objectA).path(objectB).build();

随着堆栈跟踪我有我无法检查哪个.path调用导致异常.所以我的问题是,是否有任何解决方案可以让我获得该列的参考?

(为了防范一些可能的替代答案,我们需要一个解决方案来获取列号,其他答案,如如何单步执行调试器或重构每个构建器模式等,将无法回答问题)

Udo*_*ski 5

这是不可能的.

您可以通过以这种方式格式化代码来绕过它:

URI uri = uriInfo
           .getBaseUriBuilder()
           .path(objectA)
           .path(objectB)
           .build();
Run Code Online (Sandbox Code Playgroud)

在Oracle Java 8中,您可以编写

public static void main(String... ignored) {
    List<String> s = new ArrayList<>();
    s.add("hello");

    Predicate<? super String> predicate1 = (t) -> t.length() > 0;
    Predicate<? super String> predicate2 = (t) -> t.length() < 8;
    Predicate<? super String> predicate3 = null;

    List<String> collect = s.stream()
            .filter(predicate1) // 16
            .filter(predicate2) // 17
            .filter(predicate3) // 18
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

你明白了

Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.stream.ReferencePipeline.filter(ReferencePipeline.java:161)
    at Example.main(Example.java:18)
Run Code Online (Sandbox Code Playgroud)

对于Oracle JDK,这似乎只在Java 8中,而不是Java 7中.

  • 我不确定这总是有效的.我经常看到第一行受到指责. (5认同)
  • 这是编译器所依赖的,即`javac`生成的代码将责备第一行,而eclipse按预期执行. (3认同)
  • @ user1066946:Eclipse**确实**带有自己的java编译器 (2认同)