java - Java堆栈跟踪中的神秘位置
问题描述
像下面的例子一样,当我testSortArrayNull()
在名为的测试类中运行测试用例时ComparatorAbstractTestCase
,会抛出一个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个代码片段可以看出class中的第45行CompositeFileComparator
是class声明的位置,为什么stack trace会出现在这个神秘的位置呢?第 45 行出现在堆栈跟踪中是否有意义?谢谢大家的帮助:)
解决方案
这是因为您的班级AbstractFileComparator
具有仅限包的访问权限。即使sort
它里面的方法是public
,它也不能从包外部引用。
sort
为允许其他代码通过公共子类访问该方法CompositeFileComparator
,该方法sort
由编译后的内部重新声明CompositeFileComparator
。这是源文件中不存在的合成 Java 代码,因此编译器必须为其选择一个行号。
您使用的编译器选择了类声明的行号。其他编译器(例如,我特定版本的 Eclipse 中的编译器)选择第 1 行。由于该方法实际上并不存在于您的源代码中,因此行号没有意义。
编译器生成的方法只会调用该方法的超类版本。
如果你不希望这种情况发生,你可以创建AbstractFileComparator
一个public
类。
推荐阅读
- elasticsearch - 如何通过过滤器将重新索引应用于新数据值?
- dockerfile - 通过构建步骤在 docker 中安装 apt 包并复制
- json - MariaDB JSON 数据类型问题
- javascript - 如何从本地导入我的简历 pdf 文件并使用 React 在浏览器中查看
- javascript - 使用 vue 指令清空文本字段
- java - 片段显示不同的内容
- c++ - std::thread 编译问题
- r - R中的错误:尚未实现的方法
%*% - html - 如何在 html 和 css 中使这张图片甚至在屏幕上显示?
- time-complexity - 半尺寸嵌套循环的时间复杂度