2010-09-26 81 views
0

我於c seperately 擾2 java程序:在C \試驗和其他:\測試\新CLASSPATH內的值的順序是什麼?

我可以編譯兩者是沒有任何錯誤\ javac的

但是,當我嘗試執行該文件\ java的 它這樣表示

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at ButtonFrame.makeButton(ButtonTest3.java:42) 
    at ButtonFrame.<init>(ButtonTest3.java:29) 
    at ButtonTest$1.run(ButtonTest.java:17) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

我把這個在我的類路徑

CLASSPAT錯誤ħ值 - C:\測試; C:\測試\新

但如果我改變的值的順序在CLASSPATH本

CLASSPATH值 - C:\測試\新; C^:\測試

的錯誤只是去

爲什麼?這可能發生 只有訂單很重要?

回答

1

你在這兩個文件夾中都有一個同名的班級。在C:\test中有ButtonTest3類的一個版本,其中包含導致此NullPointerException的編程錯誤。在C:\test\newButtonTest3類的不同版本,它不包含此錯誤,或者可能有ButtonTest類,它與C:\test完全不同。

清理你的類路徑。在類路徑中使用相同的簽名來重複使用不同版本的類是不好的。如果你的意圖是new應該是一個包標識符,那麼你需要遠離類路徑。但是,這樣的包名會導致編譯錯誤,所以不能這樣做。


至於這個bug,對於naildown和fix是比較微不足道的。首先看堆棧跟蹤的第一行:

at ButtonFrame.makeButton(ButtonTest3.java:42) 

它告訴它已經發生了ButtonTest3班線42條,makeButton()方法內。現在轉到行ButtonTest3.java 42,它會看起來像:

someObject.doSomething(); 

看看那裏有一個點運算符.是被用來調用一個方法或訪問某些對象的字段。 NullPointerException表示在特定時刻someObjectnull。沒有實例!

這是一個簡單的辦法:只要確保它不null你是在調用的瞬間/訪問它:

someObject = new SomeObject(); 
// ... 
someObject.doSomething(); 
+0

需要一段時間來思考,但最後我得到了它:) – CHEMlSTRY 2010-09-26 05:06:05

+0

不客氣。 – BalusC 2010-09-26 05:19:44

0

嗯,我不相信你可以在一個源文件中定義兩個類。你可以將它們定義爲一個子類。

按照Java spec

class每個文件包含一個類或接口 的 定義。雖然類或 界面不需要有一個外部 表示字面上包含在 文件(例如,因爲是由類加載器所產生的 類), 我們將通俗是指一類或 的任何 有效表示界面,如class文件 format.format。

您可以將​​放入ButtonTest2的內部。

public class ButtonTest2 
{ 
    public static void main(String[] args) 
    { 
     ... 
     ButtonFrame frame = new ButtonFrame(); 
    } 

    class ButtonFrame extends JFrame { 
     .... 
    } 
} 

或者,把它們放在不同的java文件中。

+0

哦,對,我完全忘了。 順便說一句我已決定編輯這個問題,以更具體到我對 – CHEMlSTRY 2010-09-26 03:42:12

+0

好奇的事情,未來,你應該提出一個新的問題。不要重複使用舊問題來解決完全不同的問題。考慮回滾你的編輯並提出一個新問題。那麼我也會在那裏提出我的答案。 – BalusC 2010-09-26 03:58:48

+0

我試圖把ButtonFrame放在ButtonTest2裏面,但是有一個錯誤,我需要在某處聲明'static'。我找不到它 – CHEMlSTRY 2010-09-26 04:29:39

0

你必須在程序頂層兩班,那是錯誤的。但是要保持這一點,你的程序不會在第一時間被編譯。 成功編譯程序使用以下NppExec腳本:

cmd /c cd "$(CURRENT_DIRECTORY)" && "%JAVA_HOME%\bin\javac" "$(FULL_CURRENT_PATH)" 
cmd /k cd "$(CURRENT_DIRECTORY)" && "%JAVA_HOME%\bin\java" "$(NAME_PART)" && exit 

確保你有你的JDK文件夾設置爲JAVA_HOME環境變量。 並再試一次。

+0

我正在使用我在互聯網上發現的3行腳本,但覺得它不能正常工作, 現在與我們的腳本它真的工作! – CHEMlSTRY 2010-09-26 04:10:16