2014-07-22 30 views
0

我不断收到一个NoClassDefFoundError每当我试图运行的代码的Java怪异的NoClassDefFoundError

ClassTable.getInstance(); 

下面这一块是ClassTable

代码
public class ClassTable 
{ 
    private static ClassTable classTable = new ClassTable(); 
    private Map<String,Object> pricingTable; 
    private Date expiry; 


    private ClassTable() 
    { 
     this.expiry = this.getExpiry(); 
     this.pricingTable = buildPricingTables(); 
    } 

    private Date getExpiry() 
    { 
     return DateUtils.INSTANCE.getCutOff(); 
    } 

    public static ClassTable getInstance() 
    { 
     return classTable; 
    } 
} 

我试图步入方法getInstance();然而,它立即抛出错误。这里是栈跟踪

java.lang.NoClassDefFoundError: Could not initialize class helper.ClassTable 
    at models.SinglePaymentLoan.getPricingTable(SinglePaymentLoan.java:742) 
    at unit.SinglePaymentLoanTest.testPricingTable(SinglePaymentLoanTest.java:135) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at play.test.PlayJUnitRunner$StartPlay$2$1.evaluate(PlayJUnitRunner.java:114) 
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:47) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:18) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at play.test.PlayJUnitRunner.run(PlayJUnitRunner.java:58) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:24) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:136) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:117) 
    at play.test.TestEngine.run(TestEngine.java:112) 
    at controllers.TestRunner$1.doJobWithResult(TestRunner.java:71) 
    at controllers.TestRunner$1.doJobWithResult(TestRunner.java:1) 
    at play.jobs.Job.call(Job.java:146) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:695) 
+2

这意味着您在构建路径中缺少jar或类。这可能会发生,因为你没有放在那里或者没有建立这个项目。 –

+2

你尝试访问的'DateUtils'来自哪里? –

+0

从我所见最可能DateUtils是问题,因为这是ClassTable构造函数所要求的。也许是编译问题? – fipple

回答

2

请注意,它声明它不能初始化类。这表明该类的静态初始化存在问题。

您有一个静态变量classTable试图创建一个新的ClassTable实例。

private static ClassTable classTable = new ClassTable(); 
private Map<String,Object> pricingTable; 
private Date expiry; 

private ClassTable() 
{ 
    this.expiry = this.getExpiry(); 
    this.pricingTable = buildPricingTables(); 
} 

因此,现在创建ClassTable实例的任何错误都会导致类初始化失败。你在构造函数中做了两件事,每一件都可能失败。

您打电话给getExpiry,我们看到轮流并呼叫DateUtils.INSTANCE.getCutOff()。你还没有提供这个代码,所以它不知道这是什么。

最后,您致电buildPricingTables()。再一次,这种方法没有提供代码。

所以你最可能的两个犯人是DateUtils.INSTANCE.getCutOff()buildPricingTables()