不含包層次的HelloWorld.java
public class HelloWorld
{
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
保存在E:\java\src下,使用javac命令編譯:
E:\java\src>javac HelloWorld.java
運(yùn)行:
E:\java\src>java HelloWorld
屏幕打印出:
Hello World!
初學(xué)者常犯的錯(cuò)誤
- 1. 運(yùn)行時(shí),帶了.class后綴
如果你試圖使用如下命令:
E:\java\src>java HelloWorld.class
系統(tǒng)會(huì)誤認(rèn)為你運(yùn)行的是HelloWorld包下的名為class的類文件,會(huì)到系統(tǒng)的CLASSPATH下(一般都包括當(dāng)前目錄)企圖尋找HelloWorld.class.class這樣的類,這樣的類當(dāng)然不存在了;并且也不可能存在,因?yàn)閏lass是關(guān)鍵字,不能作為一個(gè)類的名字。所以會(huì)報(bào)如下錯(cuò)誤信息:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class
- 2. 文件名大小寫錯(cuò)誤
對于像Windows這樣的系統(tǒng),編譯時(shí)可以不關(guān)心大小寫。比如編譯HelloWorld.java時(shí),也可以使用:
E:\java\src>javac helloworld.java
也可以編譯通過,但產(chǎn)生的類文件仍然是和源文件相符的:HelloWorld.class。
但在運(yùn)行時(shí)一定要注意大小寫,比如試圖使用如下命令運(yùn)行:
E:\java\src>java helloworld
將報(bào)類似于1中的錯(cuò)誤:
Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)
包含包層次的HelloWorld.java
比如上面的HelloWorld.java修改如下:package org.javaresearch;
public class HelloWorld
{
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
編譯時(shí)有兩種方法
- 1. 直接編譯
E:\java\src>javac HelloWorld.java
此時(shí)在當(dāng)前目錄下輸出HelloWorld.class。此時(shí),運(yùn)行不能使用上面相同的方法,使用:
E:\java\src>java HelloWorld
運(yùn)行時(shí),出現(xiàn)如下錯(cuò)誤:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)
從上述錯(cuò)誤信息你也可以看到,系統(tǒng)可以找到HelloWorld類(因?yàn)楫?dāng)前路徑包含在CLASSPATH中,具體為什么會(huì)提示wrong name,有興趣的朋友參見Java語言規(guī)范),但這個(gè)類屬于org.javaresearch包。所以,你要做的就是按照上述包層次,相應(yīng)的創(chuàng)建目錄層次,把上面生成的HelloWorld.class放到E:\java\src\org\javaresearch\目錄下。運(yùn)行:
E:\java\src >java org.javaresearch.HelloWorld
系統(tǒng)打印出:
Hello World!
這兒要注意的是,不能使用java org\javaresearch\HelloWorld來運(yùn)行,此時(shí)同樣會(huì)出現(xiàn)如下錯(cuò)誤:
Exception in thread "main" java.lang.NoClassDefFoundError:org\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)
哈哈,是不是有點(diǎn)怪怪的,那沒辦法。以后對Java的包有更深的認(rèn)識(shí)時(shí),就會(huì)明白了。
- 2. 使用 -d <directory>編譯選項(xiàng)
是不是覺得上面的編譯方法有點(diǎn)麻煩,能不能自動(dòng)在當(dāng)前路徑(或任意指定的路徑)下生成包層次呢?有!使用-d <directory>編譯選項(xiàng)就能做到。
E:\java\src >javac -d . HelloWorld.java
此時(shí),在當(dāng)前目錄下就生成了一個(gè)org\javaresearch目錄,并且輸出的.class文件也在里面。運(yùn)行:
E:\java\src >java org.javaresearch.HelloWorld
系統(tǒng)打。篐ello World!
如果你想把生成的類文件集中存放在一個(gè)目錄中,比如:E:\java\classes下,那么你首先創(chuàng)建這個(gè)目錄,然后編譯時(shí):
E:\java\src >javac -d E:\java\classes HelloWorld.java
就可以把生成的類文件放到E:\java\classes目錄下,并且按照包層次相應(yīng)的創(chuàng)建目錄路徑。你可以在E:\java\classes\org\javaresearch下找到HelloWorld.class文件。此時(shí)使用如下命令可以正確運(yùn)行(注意如果要用到其它類,請?jiān)贑LASSPATH中設(shè)好):
E:\java\classes >java org.javaresearch.HelloWorld