如果字符串编码
是构造函数的参数,则java.io和Formatter中几乎所有类的构造函数总是抛出checked UnsupportedEncodingException
。
但是 Scanner 完全不同 - 如果编码参数拼写错误/错误,它只会抛出runtine IllegalArgumentException
。
Scanner 类构造函数似乎是所有 java API 中唯一不抛出检查的 UnsupportedEncodingException 的构造函数(具有对构造函数的参数进行编码的字符串),仅抛出运行时 IllegalArgumentException。
这是为什么呢?只是一个设计/兼容性的怪癖还是背后有一些深层的推理?
最佳答案
首先,唯一能明确回答这个问题的是设计相应界面的人。
我认为这个决定是经过深思熟虑的。
UnsupportedEncodingException
异常有点异常:
它是
IOException
的子类型,其中编码/解码实际上与 I/O 正交:考虑String(byte[], String)
构造函数。这是一个受检查的异常,但有令人信服的论据表明它应该不受检查:
如果确实抛出了
UnsupportedEncodingException
,则很可能是编程错误的结果,而不是您的应用程序可以从中恢复的错误。最常见的用例之一是将字符串“UTF-8”作为编码名称。 Java 规范保证 UTF-8 将始终受到兼容 JVM 的支持,但由于检查了异常,我们仍然需要编写一个处理程序……以处理不可能发生的故障。
鉴于这些问题,我认为设计者决定最好不要在 Scanner
中使用 UnsupportedEncodingException
,并在请求的情况下使用未经检查的异常不支持编码。
关于java - 为什么带有 String 编码参数的 Scanner 构造函数不会抛出 UnsupportedEncodingException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957965/