请注意,这不是this的重复。
我一直在编写一些作为JUnit运行的代码。我阅读了上面链接的线程,它讨论了堆栈跟踪中错误的位置通常如何最接近底部。但是,因为我的代码是作为JUnit测试运行的,所以堆栈跟踪注入了很多我认为代码作为单元测试运行的结果, 所以错误不能是直接跟踪到堆栈跟踪的底部,就像上面的帖子所说 。(< - 为什么它不是重复的)。
以下是运行代码后得到的堆栈跟踪。
java.lang.NullPointerException
at API.ItemFetcher.<init>(ItemFetcher.java:39)
at API.MarketConstants.<clinit>(MarketConstants.java:24)
at API.ItemFetcher.setOtherMonetaryValues(ItemFetcher.java:153)
at API.ItemFetcher.<init>(ItemFetcher.java:53)
at Tests.Tests.test(Tests.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我的代码结构如下
-src
-API
-Item.java
-ItemFetcher.java
-MarketConstants.java
-IrrelevantFolder
-Tests
-Tests.java
我应该在哪里查看基于堆栈跟踪的代码以查找错误?由于堆栈跟踪中的所有JUnit内容,我不能100%确定要查找的位置。就像我之前说的那样,我已经阅读了其他SO线程,但之前没有涉及过。
答案 0 :(得分:3)
如果查看堆栈跟踪中的根本原因,它会指出NullPointerException
发生at API.ItemFetcher.<init>(ItemFetcher.java:39)
。这意味着在第39行,在ItemFetcher
类内,发生了NullPointerException
。
请记住,JUnit只是调用您现有的类/方法。因此,请始终查找代码在堆栈跟踪中的位置。
答案 1 :(得分:0)
堆栈跟踪是一个强大的工具,您引用的post提供了有关如何使用它的非常好的建议。
但堆栈跟踪只是 一个“工具”。 你必须做这项工作。你必须从逻辑上认为 。
你一定不能说废话,比如“line'PallFetcher.java:xyz'总是习惯工作,所以它不可能成为问题”。那是我投票给你的时候;)你已经删除了那句话(谢谢!),我已经撤回了我的投票。
以下是我解决问题的方法:
是的,你的追溯中有很多“JUnit”的东西。
问:JUnit如何导致问题?
答:可能不能。就像RamV13(正确!)指出的那样,“请记住,JUnit只是调用你现有的类/方法。所以总是寻找代码在堆栈跟踪中的位置”。
因此,对于初学者,我会在代码中查看其他,并忽略JUnit行。
正如RamV13也指出的那样,“ItemFetcher.java:39”是“你的代码”开始的地方。这绝对是一个开始寻找的好地方。
问:你在寻找什么 ?
答:如果你有一个“DivideByZero”错误,你会找到一个可能评估为“0”分母的算术表达式。如果您有“IOException”,那么您将寻找“open()”,“read()”或“write()”。
在这种情况下,你有一个“NullPointerException”。
所以你正在寻找 AN UNINITIALIZED VARIABLE 。
问:什么变量?
最好看的地方是发生NullPointerException的确切行:
java.lang.NullPointerException
at API.ItemFetcher.<init>(ItemFetcher.java:39)
<-- Your problem is an uninitialized variable at line 39!
这是你要弄明白的。在代码中向后看(甚至可以追溯到ItemFetcher.java:39)并查看应的初始化位置。
然后解决它:)
'希望有所帮助!