-
1 # 萬貓學社
-
2 # Hz赫茲
首先,讓我們簡單瞭解一下怎樣使用java命令來執行java程式的正確方法。
語法是這樣的:
java [<options>] <class-name> [<arg> ...]
其中<option>是命令列選項(以“-”字元開頭),<class-name>是Java類完整名稱(FQN),包括類所在的包,比如說packagename.packagename2.ClassName,或者packagename/packagename2/ClassName,而<arg>是傳遞給應用程式的命令列引數。舉個例子:
java -Xmx100m com.hello.world.HelloWorld arg1 arg2
上面這個命令會執行以下操作:
搜尋com.hello.world.HelloWorld類的位元組碼載入類判斷類是否包含主方法入口呼叫主方法入口,並把引數arg1和arg2傳遞給它當出現“找不到或無法載入主類...”的情況時,表明第一步已失敗,Java命令無法找到類。並且在錯誤訊息中會給出正在尋找的類名。
下面說一說為什麼會出現找不或者無法載入類的原因:
1 類名錯誤第一個可能的原因是類名錯誤,或者正確的類名,但格式錯誤。
類名需要保證:拼寫正確(包括大小寫),並且完整(包名要包括在內)。
2 類路徑錯誤2.1 類路徑設定錯誤
類路徑(CLASSPATH)是Java執行時環境搜尋類和其它資原始檔的路徑。
類路徑的設定的完整解釋可以去看一下Oracle文件,這裡給出一個簡單的說明。
windows下類路徑的設定命令:
set CLASSPATH=classpath1;classpath2...
Linux下類路徑的設定命令:
export CLASSPATH="classpath1:classpath2..."
注意,windows和linux使用的分隔符不同,windows是“;”,linux是“:”.
也可以在執行時使用-cp選項來指定類路徑:
java -cp classpath <class-name> [<arg> ...]
設定類路徑時,它應該對應於類完整名稱的根目錄。
2.2 子目錄和類完整名(FQN)不匹配
比如,如果類的完整名稱是com.hello.world.HelloWorld,那麼JVM查詢時,會在子目錄“com/hello/world”中找名為HelloWorld的類。如果子目錄與包命名不匹配,也會導致JVM將找不到類。
如果編譯後曾經移動過類或者重新命名了類,也會導致命令執行失敗,但是導致的錯誤將會是java.lang.NoClassDefFoundError,並不是找不到或者無法載入類。
給個完整的例子
想執行com.hello.world.HelloWorld類,
完整的檔案路徑是/java/coding/com/hello/world/HelloWorld.class,
當前的工作目錄是/java/coding/,
那麼執行:
java com.hello.world.HelloWorld
如果當前工作目錄是/java/coding/com/hello/world/,
那麼需要指定類路徑(類路徑可以是相對路徑也可以是完全路徑):
java -cp ../../../ com.hello.world.HelloWorld
3 類路徑中缺少類的依賴dependencies類路徑需要包括所有程式依賴的其它(非系統)的類。系統類是自動定位的,但需要確保非系統類在類路徑當中,方法如上所示。
希望這個回答可以幫到你。
-
3 # IT技術專家孫鑫
提示無法載入主類,原因:(1)執行時,沒有給出包含main方法的類;(2)你的類都沒有給出入口方法main,當然無法運行了。
回覆列表
因為沒有程式碼不能直接判斷出錯誤原因,不過出現這種錯誤一般是以下兩種原因造成的:
1.環境變數配置不當。檢視環境變數ClassPath的值是否正確,如下圖:
變數值為:
.;%JAVA_HOME%\lib;%JRE_HOME%\lib
特別注意是,要用“.”這個配置,它表示當前路徑,一定要有。
另外,儲存環境變數以後,一定重新開啟一個cmd可執行視窗,否則環境變數不會生效的。
2.程式碼中帶有包名比如下面這段程式碼:
編譯以後執行就會報錯,如下圖:
只要包名去掉就可以了,如下圖:
再重新編譯一下就可以運行了,如下圖: