如果UnsupportedEncodingException
是构造函数的参数,则java.io和Formatter中几乎所有类的构造函数都始终抛出 checked String encoding
。
但是Scanner完全不同-如果编码参数拼写错误/错误,它只会抛出 runtine IllegalArgumentException
。
扫描器类构造函数似乎是唯一一个在所有Java API中都不会抛出UnsupportedEncodingException异常(具有对构造函数的参数进行编码的字符串),仅抛出运行时IllegalArgumentException的对象。
那是为什么?仅仅是设计/兼容性的怪癖或背后的深层推理?
答案 0 :(得分:2)
首先,唯一可以明确回答这个问题的人就是设计相应界面的人。
我认为这个决定是故意的。
UnsupportedEncodingException
异常有点异常:
它是IOException
的子类型,其中编码/解码实际上与I / O正交:请考虑String(byte[], String)
构造函数。
这是一个已检查的异常,但是有令人信服的论点应取消选中它:
如果实际上抛出了UnsupportedEncodingException
,则很可能是编程错误的结果,而不是您的应用程序可能能够从中恢复的错误。
最常见的用例之一是给字符串“ UTF-8”作为编码名称。 Java规范保证兼容的JVM将始终支持UTF-8,但是由于检查了异常,因此我们仍然需要编写处理程序...以防止无法发生的故障。
鉴于这些问题,我认为设计人员认为最好不要在UnsupportedEncodingException
中使用Scanner
,并且在不支持请求的编码的情况下使用未经检查的异常。 / p>