“Windows 命令行中使用 javac 编译 .java 源文件提示字符集编码错误”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“1”的新页面) |
Jihongchang(讨论 | 贡献) |
||
| (未显示同一用户的1个中间版本) | |||
| 第1行: | 第1行: | ||
| − | 1 | + | 源代码 .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 | ||
| + | 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 个错误 | ||
| + | |||
| + | </syntaxhighlight> | ||
| + | |||
| + | === 解决方案:加入 -encoding 参数 === | ||
| + | <syntaxhighlight lang="powershell"> | ||
| + | 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 | ||
| + | |||
| + | </syntaxhighlight> | ||
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