有時(shí),當(dāng)我們運(yùn)行Java程序時(shí),我們可能會(huì)看到“找不到或無(wú)法加載主類(lèi)”。原因很容易猜測(cè):JVM找不到主類(lèi)并給出了這個(gè)錯(cuò)誤。但是為什么不能呢?
在本文中,我們將討論找不到主類(lèi)的可能原因。另外,我們將看看如何修復(fù)它們。
示例程序
我們將從HelloWorld程序開(kāi)始:
1
2
3
4
5
|
public class HelloWorld { public static void main(String[] args) { System.out.println( "Hello world..!!!" ); } } |
現(xiàn)在讓我們編譯它:
1
|
$ javac HelloWorld.java |
在這里,編譯器將為我們的程序生成一個(gè).class文件。此.class文件將在同一目錄中生成。class文件將與Java程序中給定的類(lèi)名具有相同的名稱。這個(gè).class文件是可執(zhí)行的。
在下面的部分中,我們將運(yùn)行這個(gè).class文件,并嘗試?yán)斫忮e(cuò)誤“找不到或加載主類(lèi)”的可能原因。
錯(cuò)誤的類(lèi)名
要運(yùn)行Java編譯器生成的.class文件,可以使用以下命令:
1
|
java <. class filename> |
運(yùn)行我們的程序:
1
2
|
$ java helloworld Error: Could not find or load main class helloworld |
是的,它失敗了,錯(cuò)誤是“Could not find or load main class helloworld”
即找不到或加載主類(lèi)helloworld。
如前所述,編譯器將生成.class文件,其名稱與程序中Java類(lèi)的名稱完全相同。所以在我們的例子中,主類(lèi)的名稱是HelloWorld,而不是helloworld,要區(qū)分大小寫(xiě)。
讓我們用正確的方式再試一次:
1
2
|
$ java HelloWorld Hello world..!!! |
這次它成功地運(yùn)行了。
文件擴(kuò)展名
要編譯Java程序,必須提供文件名及其擴(kuò)展名(.java):
1
|
$ javac HelloWorld.java |
但是要運(yùn)行.class文件,我們需要提供類(lèi)名,而不是文件名。因此不需要提供.class擴(kuò)展:
1
2
|
$ java HelloWorld. class Error: Could not find or load main class HelloWorld. class |
同樣,讓我們使用正確的類(lèi)名運(yùn)行程序:
1
2
|
$ java HelloWorld Hello world..!!! |
Java包名稱
在Java中,我們將類(lèi)似的類(lèi)放在一起,稱之為包。
讓我們把HelloWorld類(lèi)移到com.baeldung
包:
1
2
3
4
5
6
7
|
package com.baeldung; public class HelloWorld { public static void main(String[] args) { System.out.println( "Hello world..!!!" ); } } |
現(xiàn)在,讓我們像以前一樣編譯并運(yùn)行更新的HelloWorld程序:
1
2
|
$ java HelloWorld Error: Could not find or load main class HelloWorld |
但我們?cè)俅蔚玫藉e(cuò)誤“找不到或加載主類(lèi)HelloWorld”!
讓我們?cè)囍斫馕覀冨e(cuò)過(guò)了什么。
要運(yùn)行包中的Java類(lèi),必須提供其完全限定名。所以在我們的例子中,HelloWorld的完全限定名是:com.baeldung.HelloWorld
.
現(xiàn)在,當(dāng)我們創(chuàng)建com.baeldung
包時(shí)實(shí)際上我們創(chuàng)建了一個(gè)文件夾結(jié)構(gòu),如:
1
|
com/baeldung/HelloWorld.java |
首先,讓我們嘗試從com/baeldung
目錄運(yùn)行程序:
1
2
|
$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld |
盡管如此,我們還是無(wú)法運(yùn)行我們的程序。
在這里,當(dāng)我們指定完全限定類(lèi)名時(shí):com.baeldung.HelloWorld
,Java試圖找到HelloWorld.class
類(lèi)文件在com/baeldung
中,在我們運(yùn)行程序的目錄下。
由于我們已經(jīng)在com/baeldung中,Java無(wú)法找到并運(yùn)行HelloWorld程序。
現(xiàn)在,讓我們回到父文件夾并運(yùn)行它:
1
2
|
$ java com.baeldung.HelloWorld Hello world..!!! |
是的,我們?cè)俅文軌蛳蚴澜鐔?wèn)好。
類(lèi)路徑無(wú)效
在繼續(xù)之前,讓我們首先了解什么是類(lèi)路徑classpath——它是當(dāng)前運(yùn)行的JVM可用的一組類(lèi)。
我們使用classpath變量告訴JVM在文件系統(tǒng)上的何處找到.class文件。
在運(yùn)行程序時(shí),我們可以使用-classpath選項(xiàng)提供類(lèi)路徑。例子:
1
|
java -classpath /my_programs/compiled_classes HelloWorld |
在這里,Java將尋找HelloWorld.class
類(lèi)文件在/my_programs/compiled_classes
文件夾中,這個(gè)文件夾的名稱是我們剛剛編出來(lái)的。默認(rèn)情況下,classpath變量設(shè)置為“.”,表示當(dāng)前目錄。
在上面的部分中,我們更改了目錄以運(yùn)行程序。但是如果我們想從其他文件夾運(yùn)行它呢?這時(shí)classpath變量可以幫助我們。
要從com/baeldung目錄運(yùn)行我們的程序,我們可以簡(jiǎn)單地說(shuō),我們的類(lèi)路徑是向上的兩個(gè)目錄—每個(gè)包部分一個(gè):
1
2
|
$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!! |
這里,“…”表示父目錄。在本例中,“../../”表示包層次結(jié)構(gòu)的頂部。
以上就是Java 找不到或無(wú)法加載主類(lèi)的修復(fù)方法的詳細(xì)內(nèi)容,更多關(guān)于Java 找不到或無(wú)法加載主類(lèi)的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:http://javakk.com/1427.html