java - Java 堆栈跟踪中的神秘位置

标签 java exception stack-trace

就像下面的例子,当我在名为 ComparatorAbstractTestCase 的测试类中运行测试用例 testSortArrayNull() 时,抛出一个 RuntimeException 并且生成的堆栈跟踪如下,

这是堆栈跟踪的结果,

testSortArrayNull(org.apache.commons.io.comparator.CompositeFileComparatorTest)  Time elapsed: 0.016 sec  <<< ERROR!
java.lang.RuntimeException: null
  at org.apache.commons.io.comparator.AbstractFileComparator.sort(AbstractFileComparator.java:48)
  at org.apache.commons.io.comparator.CompositeFileComparator.sort(CompositeFileComparator.java:45)
  at org.apache.commons.io.comparator.ComparatorAbstractTestCase.testSortArrayNull(ComparatorAbstractTestCase.java:96)
  ...

下面是测试类ComparatorAbstractTestCase的部分代码,

public abstract class ComparatorAbstractTestCase extends FileBasedTestCase {

    /** comparator instance */
    protected CompositeFileComparator comparator;
    ...
    @Test
    public void testSortArrayNull() {
        assertNull(comparator.sort((File[])null)); /** LINE 96 */
    }
    ...
 }

这里是 CompositeFileComparator 类的部分代码,用 AbstractFileComparator 类扩展。

import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CompositeFileComparator extends AbstractFileComparator implements Serializable { /** LINE 45 */
    ... // no sort() method
}

这里是类AbstractFileComparator的部分代码,它有sort()方法。

import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

abstract class AbstractFileComparator implements Comparator<File> {

    public File[] sort(final File... files) {
        if (files != null) {
            Arrays.sort(files, this);
        }
        if (files == null) { 
            throw new RuntimeException(); /** LINE 48 */
        }
        return null;
    }
    ...
}

从上面3个代码片段可以看出类CompositeFileComparator中的第45行是类声明的位置,为什么stack trace会定位到这个神秘的位置呢?第 45 行出现在堆栈跟踪中是否有意义?感谢大家的热心帮助:)

最佳答案

是因为你的类AbstractFileComparator具有仅限包的访问权限。尽管 sort里面的方法是public , 它不能从包外引用。

允许其他代码访问sort通过公共(public)子类的方法 CompositeFileComparator , 方法 sortCompositeFileComparator 中的编译器重新声明.这是源文件中不存在的合成 Java 代码,因此编译器必须为其选择行号。

您使用的编译器选择了类声明的行号。其他编译器(例如我特定版本的 Eclipse 中的编译器)选择行号 1。由于该方法在您的源代码中并不真正存在,因此行号没有意义。

编译器生成的方法只会调用该方法的父类(super class)版本。

如果你不希望这种情况发生,你可以制作AbstractFileComparator一个public类。

关于java - Java 堆栈跟踪中的神秘位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50920229/

相关文章:

python - 基本 Python 元编程 : populating dictionaries?

java - 配置文件的位置

java - Google App Engine 应用程序 (Java) 中的 Facebook 登录

java - 在 Java 中创建对象数组

c# - 在方法中使用 `try-catch` 是不好的做法吗?

scala - 规范 2:如何使用 "failtrace"选项

java - 仅提取 1 个单词的行?

c# - 如何处理从BackgroundWorker的DoWork处理程序抛出的异常?

r - 使用 tryCatch 保存错误回溯

python - 获取导致异常的异常描述和堆栈跟踪,全部作为字符串