java - 为什么带有 String 编码参数的 Scanner 构造函数不会抛出 UnsupportedEncodingException?

标签 java encoding character-encoding

如果字符串编码是构造函数的参数,则java.io和Formatter中几乎所有类的构造函数总是抛出checked UnsupportedEncodingException

但是 Scanner 完全不同 - 如果编码参数拼写错误/错误,它只会抛出runtine IllegalArgumentException

Scanner 类构造函数似乎是所有 java API 中唯一不抛出检查的 UnsupportedEncodingException 的构造函数(具有对构造函数的参数进行编码的字符串),仅抛出运行时 IllegalArgumentException。

这是为什么呢?只是一个设计/兼容性的怪癖还是背后有一些深层的推理?

最佳答案

首先,唯一能明确回答这个问题的是设计相应界面的人。

我认为这个决定是经过深思熟虑的。

UnsupportedEncodingException 异常有点异常:

  • 它是 IOException 的子类型,其中编码/解码实际上与 I/O 正交:考虑 String(byte[], String) 构造函数。

  • 这是一个受检查的异常,但有令人信服的论据表明它应该不受检查:

    1. 如果确实抛出了UnsupportedEncodingException,则很可能是编程错误的结果,而不是您的应用程序可以从中恢复的错误。

    2. 最常见的用例之一是将字符串“UTF-8”作为编码名称。 Java 规范保证 UTF-8 将始终受到兼容 JVM 的支持,但由于检查了异常,我们仍然需要编写一个处理程序……以处理不可能发生的故障。

鉴于这些问题,我认为设计者决定最好不要在 Scanner 中使用 UnsupportedEncodingException,并在请求的情况下使用未经检查的异常不支持编码。

关于java - 为什么带有 String 编码参数的 Scanner 构造函数不会抛出 UnsupportedEncodingException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957965/

相关文章:

python - 如何转换阿拉伯语 Unicode

html - 我可以让浏览器选择 UTF-8 来查看源代码吗?

php - 如何将php设置为utf-8

html - 在 R 中转换 HTML 字符实体编码

java - ActiveMQ ObjectMessage 中的映射抛出 ClassCastException : cannot assign instance of java. util.CollSer?

java - 如何解决 "operator * cannot be applied to java.lang.string"?

java - 完美的Java代码来确定Double是否是完全平方?

Java 8 流维护特定的映射键顺序从分组操作返回

cookies - 语言不可知的 cookie 编码/解码标准