运行java -jar报错,报错信息如下:
org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:215)
at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:173)
at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:168)
at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:123)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1204)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:320)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:238)
at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:210)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)
at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:152)
at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:109)
at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:149)
at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:510)
at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:203)
at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:169)
at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:84)
at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
at com.alibaba.cloud.nacos.parser.NacosDataParserHandler.parseNacosData(NacosDataParserHandler.java:92)
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData(NacosPropertySourceBuilder.java:107)
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.build(NacosPropertySourceBuilder.java:74)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosPropertySource(NacosPropertySourceLocator.java:199)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosDataIfPresent(NacosPropertySourceLocator.java:186)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadApplicationConfiguration(NacosPropertySourceLocator.java:149)
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:103)
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:50)
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:46)
at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.doInitialize(PropertySourceBootstrapConfiguration.java:120)
at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:110)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:627)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:401)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:334)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.hxunt.api.IszMiniAppApiApplication.main(IszMiniAppApiApplication.java:26)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:118)
at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:180)
... 40 common frames omitted
错误分析:
1.错误来源:
- 错误发生在 org.yaml.snakeyaml.reader.StreamReader.update 方法中。
- 具体原因是 java.nio.charset.MalformedInputException,表示输入数据的编码格式不正确。
2.可能的原因:
- YAML 文件的内容存在非 UTF-8 编码字符。
- 文件中可能存在隐藏的非法字符(如 BOM 字符)。
- 配置文件的编码与程序预期的编码不一致。
3.关键点:
- Spring Boot 使用 SnakeYAML 解析 YAML 文件时,默认假设文件是 UTF-8 编码。
- 如果文件包含其他编码(如 GBK 或 ISO-8859-1),会导致解析失败。
解决方案:
1.检查 YAML 文件编码:
- 确保 YAML 文件保存为 UTF-8 编码,且没有 BOM(Byte Order Mark)。
- 使用文本编辑器(如 VSCode、Notepad++)打开文件,选择“另存为”并设置编码为 UTF-8。
2.检查文件内容:
- 查看 YAML 文件中是否存在非法字符或特殊符号。
- 删除多余的空格或换行符,确保格式符合 YAML 规范。
3.强制指定编码:
- 如果无法修改文件编码,可以在程序中强制指定编码为 UTF-8。例如,在 Spring Boot 中添加以下配置:
spring.cloud.nacos.config.encoder=utf-8
- 或者在cmd启动方式中,在启动参数中指定 JVM 编码:
java -Dfile.encoding=UTF-8 -jar your-application.jar
4.验证 Nacos 配置:
- 如果 YAML 文件是从 Nacos 拉取的配置,确保 Nacos 中存储的配置也是 UTF-8 编码。
- 检查 Nacos 配置的 Data ID 和 Group 是否正确。
5.调试日志:
- 启用调试日志以定位问题:
logging.level.org.springframework.boot.env=DEBUG
logging.level.com.alibaba.cloud.nacos=DEBUG
总结
该问题通常是由于 YAML 文件编码不正确或文件中存在非法字符导致的。建议按照上述步骤逐一排查,优先确保文件编码为 UTF-8,并删除可能的非法字符。