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

时间:2018-12-28 11:36:06

标签: java encoding character-encoding

如果UnsupportedEncodingException是构造函数的参数,则java.io和Formatter中几乎所有类的构造函数都始终抛出 checked String encoding

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

扫描器类构造函数似乎是唯一一个在所有Java API中都不会抛出UnsupportedEncodingException异常(具有对构造函数的参数进行编码的字符串),仅抛出运行时IllegalArgumentException的对象。

那是为什么?仅仅是设计/兼容性的怪癖或背后的深层推理?

1 个答案:

答案 0 :(得分:2)

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

我认为这个决定是故意的。

UnsupportedEncodingException异常有点异常:

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

  • 这是一个已检查的异常,但是有令人信服的论点应取消选中它:

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

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

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