SpringBoot项目报错Caused by: java.nio.charset.MalformedInputException: Input length = 1

一、SpringBoot项目报错

先展示一下项目报错
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
主要的报错有三个

  • java.lang.IllegalStateException: Failed to load property source from 'file:/D:/zhuomian/%E。。。
  • Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
  • Caused by: java.nio.charset.MalformedInputException: Input length = 1
    最直接的原因应该是最后一个,有时候会变成Input length = 2
    这个报错原因大概意思就是,编译的时候有的字符无法识别。

二、解决

正常情况,编译的时候,按照代码文件编码的方式解码就能获得正确的代码内容。就不会报这个错了。既然如此,那就是代码文件的编码方式和编译器的解码方式不一致导致的该问题。

1.编码格式

编码格式不是说我们代码中的使用的是中文还是英文,我们写的代码内容都是普通的文本格式。但是代码文件不会以文本格式保存代码,而是通过特定的编码方式保存成二进制数据。常用的编码格式是UTF-8或GBK,大概说一下区别

  • UTF-8:能将几乎所有语言都编码成二进制数据,也是最常用的编码方式
  • GBK:主要能编码中英文、数字等数据,主要特点就是能编码中文。

1.1 IDEA中查看文件的编码方式

我的IEDA是2023版的,不同版本可以在网上查一下
在这里插入图片描述
在右下角就可以查看或修改。

1.2 修改文件的编码方式

首先文件的编码格式最好不要直接修改。
原因: 不同编码方式不仅能编码的内容可能不同,将文本转换成二进制数据的方式也可能不同。
例如:UTF-8中汉字会被存储成2到4个字节,而GBK中汉字则会被固定存储为2个字节。
解决: 可以先将文件内容剪切或复制成纯文本,在将其放进一个空的其他编码方式的文件中,纯文本就会自动根据对应的编码方式保存起来。

IDEA中修改文件的编码方式

IDEA则提供了便捷的操作界面。

  • 第一步,点击上一个图片的编码方式按钮(上图是UTF-8),会出现一个编码方式列表
    在这里插入图片描述
  • 第二步,点击出现的编码方式列表中想变成的那个
    在这里插入图片描述
    会出现一个窗口
    在这里插入图片描述
  • 第三步,根据需要进行选择
    • Reload:代表直接修改编码方式,可能会将内容变成乱码
      点击之后会出现一个新窗口,可以选择坚持修改或者取消
      在这里插入图片描述
    • Convert:代表先复制为纯文本,再根据文本内容转换编码方式,不会有乱码风险
    • Cancel:取消

另一种修改方式

还有一种修改编码方式的方法就是:File --> Settings --> Editor —>File Encodings
这个下面解码方式中会详细讲解

2.IDEA中编译器的解码方式

点击左上角
在这里插入图片描述
然后依次选择:File --> Settings --> Editor —>File Encodings
就会出现如下界面
在这里插入图片描述

  • 1代表全局编码方式,指定所有项目的文件的编码和解码方式
  • 2代表项目编码方式,会有默认值,指定本项目的编码和解码方式。(2的优先级比1高,2生效则1不生效)
  • 画圈的地方则是所有项目文件的编码方式(优先级比2高),有的时候相同编码方式的文件会归为一行,这里也可以修改文件的编码方式
  • 3代表properties文件的编码和解码方式,这个学过spring类的项目的朋友应该知道,如果项目里面没有就不用管了。
    **注意:**修改之后不要忘记点Apply

3.解决

这个报错出现的原因就是,某些文件的编码方式和解码方式不同。
很多人就会比较奇怪,编码方式和解码方式不是同时指定的吗?其实有的文件会例外(感觉是idea的bug)
如yml文件好像只能指定编码方式,解码方式则会使用2(即项目的编码方式)
因此,尽量保证所有文件的编码方式和2相同(建议都改成utf-8,因为可编译内容很全,gbk能编译的utf-8都能编译)。
**注意:**修改之后记得手动删除target文件或通过maven的clean删除编译后的文件(建议使用maven的clean),之后运行就没问题了。

### Java 编码异常解决方案 当遇到 `java.nio.charset.MalformedInputException` 并提示输入长度为1时,这通常意味着尝试读取的数据包含无法被指定字符集解析的字节序列[^1]。 对于UTF-8编码而言,如果数据流中的某些部分不符合有效的UTF-8格式,则会触发此类异常。特别是单个字节可能代表了一个不完整的多字节字符或者是非法的起始字节[^2]。 为了处理这种情况并防止程序崩溃,可以采取如下措施: #### 使用替代字符策略 一种常见做法是在检测到损坏字符时将其替换为特定字符(通常是U+FFFD)。这种方法可以在不影响整体流程的情况下忽略个别问题字符。具体实现方式取决于使用的API版本以及上下文环境,在一些场景下可以通过设置InputStreamReader或其他相关类的参数来启用此功能[^3]。 ```java CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); decoder.onMalformedInput(CodingErrorAction.REPLACE); decoder.replaceWith("\uFFFD"); try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, decoder))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } ``` 上述代码展示了如何创建一个自定义解码器实例,并指定了在遇到畸形输入时的行为——即用特殊符号代替未知字符。 另外值得注意的是,有时错误可能是由于源文件本身存在问题或是传输过程中发生了改变所引起的。因此除了调整应用程序内部逻辑外,还应考虑检查外部因素是否影响到了原始数据的质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EEEzhenliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值