2015-01-05 160 views
0

我以前遇到過這個錯誤,但是它讓我感到困惑,因爲現在顯然是出於不同的原因,因爲我正在做我上次做的事情躲開它。我真的堅持這一點,並且一點也不知道該怎麼做。這只是我擁有的主類的測試者類,但這是發生錯誤的地方。Java「線程中的異常」main「java.lang.NoClassDefFoundError」

// test class for "CelciusAndFahrenheit" 

import java.io.*; 

class CelCiusAndFahrenhetTester 
{ 
    public static void main(String[] args) throws IOException 
    { 

    //Making Input and reading to variable 
    String inInput; 
    InputStreamReader inStream = new InputStreamReader (System.in); 
    BufferedReader reader = new BufferedReader (inStream); 
    System.out.println ("Please state which temperature type you are converting to"); 
    inInput = reader.readLine(); 

    if (inInput != "Celcius") 
     { 
      System.out.println ("What is the temperature amount you wish to convert?"); 
      inInput = reader.readLine(); 
      CelciusAndFahrenheit temperatureF = new CelciusAndFahrenheit(); 
      double answer = Double.parseDouble(inInput); 
      temperatureF.setFahrenheit(answer); 
      temperatureF.tFah(); 
     } 
    else 
     { 
      System.out.println ("What is the temperature amount you wish to convert?"); 
      inInput = reader.readLine(); 
      CelciusAndFahrenheit temperatureC = new CelciusAndFahrenheit(); 
      double answer = Double.parseDouble(inInput); 
      temperatureC.setCelcius(answer); 
      temperatureC.tCel(); 
     } 
    } 
} 

編輯; 不會說謊。我是一個小白菜。教我Java的人正在讓他的班級使用記事本和CMD來運行我們的程序,坦率地說,我只是迷失了方向。爲了回答這些問題中的一部分,這裏是另一個程序。

import java.io.*; 

// blueprint for "CelciusAndFahrenheit" class 
class CelciusAndFahrenheit 
{ 
    // declare instance variable as private 
    private double fahrenheit; 
    private double celcius; 

    // declare getter method public 
    public double getFahrenheit() 
    { 
     return fahrenheit; 
    } 

    // declare setter method public 
    public void setFahrenheit(double tempF) 
    { 
     fahrenheit = tempF; 
    tempF = (9.0/5.0) * celcius + 32; 
    } 

    // declare getter method public 
    public double getCelcius() 
    { 
     return celcius; 
    } 

    // declare setter method public 
    public void setCelcius(double tempC) 
    { 
     celcius = tempC; 
    tempC = (5.0/9.0) * (fahrenheit - 32); 
    } 

    public void tFah() 
    { 
    System.out.println ("The temperature you've inputted in Fahrenheit is " + fahrenheit + "."); 
    } 

    public void tCel() 
    { 
    System.out.println ("The temperature you've inputted in Celcius is "+ celcius + "."); 
    } 
} 
+1

不直接在點上,但**從不** **測試字符串與'=='或'!='相等。 –

+1

你怎麼調用這個程序?您的* classpath *可能設置錯誤,或者您位於錯誤的目錄中。這個技術筆記翻開那個話題:http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html – millimoose

+0

一定要添加異常跟蹤,所以可以告訴什麼庫是運行程序時,在'classpath'中缺少。 – mystarrocks

回答

0

嘗試再次清理並重新構建項目。

0

既然你在學習,我會看看我能不能幫你。由於我們沒有完整的錯誤,所以我們無法真正幫助您。但是,NoClassDefFoundError對於發生的事情意味着非常具體的事情。但是我們需要知道它無法找到的具體類。 NoClassDefFoundError會告訴你它找不到的類。

當您編譯Java源文件(即以.java結尾的文件)時,java編譯器(即javac)將編譯版本創建爲類文件(即以.class結尾的文件)。 JVM(即java)在.class文件中執行代碼。編譯Java文件時,您需要源代碼(即.java文件)或(.class文件),以便編譯器解析所有依賴關係。

例如,在您的程序中,CelciusAndFarenhetTester類取決於CelciusAndFahrenheit類,因爲CelciusAndFahrenheit在CelciusAndFarenhetTester的源代碼中使用。當javac編譯CelciusAndFarenhetTester時,它需要CelciusAndFahrenheit的類文件,否則會抱怨。在你的情況下,javac並不抱怨,這意味着它可以找到CelciusAndFarenhetTester和CelciusAndFahrenheit。這也意味着javac應該已經生成了兩個類文件。一個是Celcius和Fahrenheit,一個是Celcius和FarenhetTester。通常,這些文件被寫入到不同於您的源文件的目錄中。要控制這些文件的寫入位置,請在javac上設置構建路徑。例如:

javac -d bin src\*.java 

這會編譯src目錄下的所有java源文件並將類文件寫入bin目錄。如果你查看bin目錄,你會看到.class文件。

當你得到一個NoClassDefFoundError時,它意味着當它編譯該類時,它找到了所有的依賴關係。但是,當你去運行它時,java找不到一個或多個需要的類文件。 Java在類路徑中查找類文件。如果你的程序找不到類,那是因爲它不在classpath中。所以如果我們想要運行上面創建的類文件,我會執行以下操作:

java -cp bin CelciusAndFarenhetTester 

-cp選項設置類路徑。您可以指定任意數量的目錄,將其與平臺使用的任何目錄分開(; windows,:*/unix平臺)。您只需要包含軟件包或類文件的頂級目錄。

相關問題