在某些语言中,可以在堆栈跟踪中获取行的列号,但在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调用导致异常.所以我的问题是,是否有任何解决方案可以让我获得该列的参考?
(为了防范一些可能的替代答案,我们需要一个解决方案来获取列号,其他答案,如如何单步执行调试器或重构每个构建器模式等,将无法回答问题)
这是不可能的.
您可以通过以这种方式格式化代码来绕过它:
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中.