Java 为什么带字符串编码参数的扫描程序构造函数不会引发UnsupportedEncodingException?

Java 为什么带字符串编码参数的扫描程序构造函数不会引发UnsupportedEncodingException?,java,encoding,character-encoding,Java,Encoding,Character Encoding,如果字符串编码是构造函数的参数,则java.io和Formatter中几乎所有类的构造函数都会抛出checkedUnsupportedEncodingException 但Scanner完全不同——如果编码参数拼写错误,它只抛出runtineIllegalArgumentException 在所有java API中,扫描器类构造函数似乎是唯一一个不抛出checked UnsupportedEncodingException的构造函数(使用字符串编码构造函数的参数),只抛出运行时IllegalAr

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

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

在所有java API中,扫描器类构造函数似乎是唯一一个不抛出checked UnsupportedEncodingException的构造函数(使用字符串编码构造函数的参数),只抛出运行时IllegalArgumentException。


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

首先,唯一能够明确回答这一问题的人是设计相应接口的人

我认为这个决定是故意的

UnsupportedEncodingException
异常有点异常:

    >P>这是一个子类型:代码> IOExabue/COD>,其中编码/解码实际上与I/O正交:考虑<代码>字符串(字节[],字符串)< /C>构造函数。

  • 这是一个已检查的异常,但有令人信服的理由认为应该取消检查:

  • 如果实际引发了
    UnsupportedEncodingException
    ,则很可能是编程错误导致的,而不是应用程序能够从中恢复的错误

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


考虑到这些问题,我认为设计师决定最好不要在
扫描仪中使用
未经支持的编码异常
,在请求的编码不受支持的情况下使用未经检查的异常。

除了给出意见或猜测之外,几乎不可能回答。我猜这个构造函数是在1.7版本中创建的,当时,检查异常已经被认为是一个坏主意,特别是在99%的情况下,字符集是,我不知情的猜测是UnsupportedEncodingException很难处理,因为它是一个需要显式处理的检查异常(没有人喜欢这些)。涉及到这一点,并引入了传递字符集对象而不是字符串的重载,因此将来情况可能会更好。