关于Java 错误: 编码 GBK 的不可映射字符 (0x95)
今天第一次学习java,敲了一段Hello World代码,如下:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World!");
}
}
在vscode中运行一切正常哈,但是当我在cmd中尝试运行时,却产生了报错,如图所示:
为什么这样子咧?根据经验,乱码一般是由于编码和解码时采用了不同的标准造成的。
那么这里想搞清楚问题原因,就要引出Java的工作原理了,Java是一个半编译半解释的语言,以文件Hello.java 为例 :
与之原理向对应的Java环境也就是JDK,在其安装目录的bin目录下有两个可执行文件 javac.exe 和 java.exe。他们的作用分别为:
- javac.exe 先将源代码编译成 *.class 文件
- java.exe 执行 编译完的 *.class 文件
我的VScode默认是utf-8的编码,也就是说我的Hello.java使用的utf-8,我看到网上解决方案发现可以使用以下语句解决:“javac -encoding UTF-8 文件名.java”
尝试以后发现虽然解决了乱码问题,但也产生了新的错误,如图:
看来文件编码还是有问题,使用nodepad++打开,找到【编码】 查看文件格式,发现是utf-8+BOM,选择 【转为utf-8格式】,这下问题应该就解决了,再次尝试
咦?为什么没有按照预料的输出那句“Hello World”呢?我对着电脑屏幕陷入了沉思(其实是懵逼了…)当我的目光放到了目标文件夹的时候,我才恍然大悟:
这里新生成了一个Hello.class文件,说明这里只是用 javac.exe对文件进行了编译,而Java生成*.exe文件需要两步 编译+解释,也就是说我还需要调用java.exe 来把.class 变成 .exe 文件,我赶忙在窗口再输入一句:“java Hello”(这里解释字节码文件是不需要后缀的)
芜湖~ 想不到这么一个简单的问题居然花了我将近半个小时去解决,看来在学习的道路上还差得远啊~
以后要多记录一下踩到的坑,慢慢积累,争取早日摆脱菜鸟称号~