PersonTest.java:1: 錯誤: 非法字符: \65279
解決途徑如下
用記事本打開java源文件,另存為ANSI格式
如果java文件包含中文字符,使用-encoding gbk格式進行編譯,如javac -d . PersonTest.java -encoding gbk
(注意,這里如果使用-encoding utf8仍然會報錯)
分析:這里之所以提示“非法字符: \65279”,和UTF-8編碼有着密切的聯系。准確的說,是在UTF-8編碼的基礎上添加了BOM頭( Byte Order Mark)所造成的。它作為一種Unicode簽名方式,是UTF編碼方案里用於標識編碼的標准標記。在UTF-16里本來是FF FE,而在UTF-8就成了EF BB BF。這個標記是可選的,因為UTF8字節沒有順序,所以它可以被用來檢測一個字節流是否是UTF-8編碼的。微軟做這種檢測,但有些軟件不做這種檢測,而把它當作正常字符處理。
解決方法:使用記事本另存為ANSI格式,或者使用NotePad++修改格式為不含BOM的UTF-8格式(奇怪的是這樣做之后,使用記事本打開查看,卻是ANSI格式。但總之已經達到了去BOM頭的目的。)
在PHP的namespace使用過程當中,也會經常遇到類似的問題,只要使用記事本打開查看,很有可能就會觸發這個問題。
另外,與部署相關的問題:
如果java文件內聲明了pakage信息,如package test.person;
則編譯完成之后,在運行的時候需要在當前路徑下執行命令:java test/person/PersonTest或java test.person.PersonTest
如果在test/person目錄下執行java PersonTest則依然會報錯
其實這主要是系統默認設置的classpath造成的。
如果編譯的字節碼重新部署到classes目錄下:
javac -d classes PerTest.java
則編譯時可以:
java -classpath classes test/person/PersonTest
注意,切不可寫成 java -classpath classes classes/test/person/PersonTest
這里其實可以分為兩種情形,一種是指定classpath的,則filepath無需玩猴子能,只需寫packagepath,因為可以自動組裝。
第二種情形,沒有指定classpath,則需要些完整的filepath:java filepath
此外,如果第一種情形仍有異常,提示找不到所要編譯的類,可以在classpath中添加當前路徑。
具體格式為: java -classpath classpathexample packagepathexample(contain targer class filename)
注意:classpath與包路徑是兩碼事,運行的時候,查找的路徑=classpath/package_path,切不可把二者重疊使用,那樣運行時就會找不到class字節碼,因為絕對路徑錯了。
其實,本質上這里一共涉及到三個path,也就是classpath,filepath,packagepath。使用java命令進行運行的時候,本質上是:
java -classpath "classpath" filepath/filename ,這里的filename指的是所要運行的字節碼class文件的文件名。filepath是該字節碼文件的具體路徑。運行時,JVM虛擬機會在filepath找到該文件,然后根據指定的classpath以及class文件內部所包含的包路徑信息重新計算出一個完整的路徑,如果該路徑與實際路徑冪等,則是可以正常運行的,否則,仍然會報錯提示無法加載該類。
如果編譯時臨時設置jar包的classpath,可以這樣:
javac -classpath "lib/*" -d . *.java
lib目錄下都是jar包。
注意:如果一次指定多個classpath,則需要使用“path1;path2”的方式給出classpath。