2014-07-22 25 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()