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。

原文地址:https://www.cnblogs.com/ioveNature/p/6926257.html