Yon*_*eng 1 java exception stack-trace
与下面的示例类似,当我testSortArrayNull()在名为test的测试类中运行测试用例时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)
...
Run Code Online (Sandbox Code Playgroud)
这是测试类的部分代码ComparatorAbstractTestCase,
public abstract class ComparatorAbstractTestCase extends FileBasedTestCase {
/** comparator instance */
protected CompositeFileComparator comparator;
...
@Test
public void testSortArrayNull() {
assertNull(comparator.sort((File[])null)); /** LINE 96 */
}
...
}
Run Code Online (Sandbox Code Playgroud)
这是类的部分代码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
}
Run Code Online (Sandbox Code Playgroud)
这是类的部分代码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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
从上面的3个代码片段中,我们可以看到类CompositeFileComparator中的第45行是类声明的位置,为什么堆栈跟踪位于这个神秘的位置?这条线45出现在堆栈跟踪中是否有意义?谢谢你的帮助:)
这是因为您的类AbstractFileComparator具有仅包访问权限.即使其中的sort方法是public,它也不能从包外引用.
为了允许其他代码sort通过公共子类访问该方法CompositeFileComparator,该方法sort由编译内部重新声明CompositeFileComparator.这是源代码文件中不存在的合成Java代码,因此编译器必须为其选择行号.
您使用的编译器选择了类声明的行号.其他编译器(例如,我特定版本的Eclipse中的编译器)选择行号1.由于该方法在源代码中并不存在,因此行号没有意义.
编译器生成的方法只会调用方法的超类版本.
如果你不希望这样的事情发生,你可以做AbstractFileComparator一个public类.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |