javac編譯亂碼


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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM