就像下面的例子,当我在名为 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
, 方法 sort
由 CompositeFileComparator
中的编译器重新声明.这是源文件中不存在的合成 Java 代码,因此编译器必须为其选择行号。
您使用的编译器选择了类声明的行号。其他编译器(例如我特定版本的 Eclipse 中的编译器)选择行号 1。由于该方法在您的源代码中并不真正存在,因此行号没有意义。
编译器生成的方法只会调用该方法的父类(super class)版本。
如果你不希望这种情况发生,你可以制作AbstractFileComparator
一个public
类。
关于java - Java 堆栈跟踪中的神秘位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50920229/