“Windows 命令行中使用 javac 编译 .java 源文件提示字符集编码错误”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
第1行: 第1行:
源代码 .java 文件是 UTF-8 编码,含中文字符,在 Windows 命令行中运行 javac 命令编译失败:<syntaxhighlight lang="powershell">
+
源代码 .java 文件:
 +
 
 +
TestVolatile3.java<syntaxhighlight lang="java">
 +
import java.util.HashMap;
 +
import java.util.Map;
 +
 
 +
public class TestVolatile3 {
 +
 
 +
    static volatile int intVal = 0;
 +
 
 +
    public static void main(String[] args) {
 +
 
 +
        Map<Long, Long> map = new HashMap<>();
 +
 
 +
        //创建10个线程,执行简单的自加操作
 +
        for (int i = 0; i < 10; i++) {
 +
            new Thread(() -> {
 +
                for (int j = 0; j < 1000; j++) {
 +
                    intVal++;
 +
                    if (j == 999) {
 +
                        System.out.printf("id:%d 已经循环到 999\n", Thread.currentThread().getId());
 +
                    }
 +
                }
 +
            }).start();
 +
        }
 +
 
 +
        // 保证之前启动的全部线程执行完毕
 +
        while(Thread.activeCount() > 1) {
 +
            Thread.yield();
 +
        }
 +
 
 +
        System.out.println(intVal);
 +
 
 +
    }
 +
 
 +
}
 +
 
 +
</syntaxhighlight>是 UTF-8 编码,含中文字符,在 Windows 命令行中运行 javac 命令编译失败:<syntaxhighlight lang="powershell">
 
E:\record\2023\3\2>javac TestVolatile3.java
 
E:\record\2023\3\2>javac TestVolatile3.java
 
TestVolatile3.java:12: 错误: 编码 GBK 的不可映射字符 (0x80)
 
TestVolatile3.java:12: 错误: 编码 GBK 的不可映射字符 (0x80)
第17行: 第54行:
 
<syntaxhighlight lang="powershell">
 
<syntaxhighlight lang="powershell">
 
E:\record\2023\3\2>javac TestVolatile3.java -encoding utf-8
 
E:\record\2023\3\2>javac TestVolatile3.java -encoding utf-8
 
E:\record\2023\3\2>java TestVolatile3.class
 
错误: 找不到或无法加载主类 TestVolatile3.class
 
原因: java.lang.ClassNotFoundException: TestVolatile3.class
 
  
 
E:\record\2023\3\2>java TestVolatile3
 
E:\record\2023\3\2>java TestVolatile3

2023年3月2日 (四) 08:47的最新版本

源代码 .java 文件:

TestVolatile3.java

import java.util.HashMap;
import java.util.Map;

public class TestVolatile3 {

    static volatile int intVal = 0;

    public static void main(String[] args) {

        Map<Long, Long> map = new HashMap<>();

        //创建10个线程,执行简单的自加操作
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    intVal++;
                    if (j == 999) {
                        System.out.printf("id:%d 已经循环到 999\n", Thread.currentThread().getId());
                    }
                }
            }).start();
        }

        // 保证之前启动的全部线程执行完毕
        while(Thread.activeCount() > 1) {
            Thread.yield();
        }

        System.out.println(intVal);

    }

}

是 UTF-8 编码,含中文字符,在 Windows 命令行中运行 javac 命令编译失败:

E:\record\2023\3\2>javac TestVolatile3.java
TestVolatile3.java:12: 错误: 编码 GBK 的不可映射字符 (0x80)
        //鍒涘缓10涓嚎绋嬶紝鎵ц?鍗曠殑鑷姞鎿嶄綔
                         ^
TestVolatile3.java:18: 错误: 编码 GBK 的不可映射字符 (0xB0)
                        System.out.printf("id:%d 宸茬粡寰幆鍒? 999\n", Thread.currentThread().getId());
                                                        ^
TestVolatile3.java:24: 错误: 编码 GBK 的不可映射字符 (0x95)
        // 淇濊瘉涔嬪墠鍚姩鐨勫叏閮ㄧ嚎绋嬫墽琛屽畬姣?
                                 ^
3 个错误

解决方案:加入 -encoding 参数

E:\record\2023\3\2>javac TestVolatile3.java -encoding utf-8

E:\record\2023\3\2>java TestVolatile3
id:13 已经循环到 999
id:17 已经循环到 999
id:16 已经循环到 999
id:19 已经循环到 999
id:21 已经循环到 999
id:20 已经循环到 999
id:22 已经循环到 999
id:14 已经循环到 999
id:18 已经循环到 999
id:15 已经循环到 999
7759