Ale*_*rov 16 java exception utf-8 character-encoding
Java可能会UnsupportedEncodingException在使用"UTF-8"编码时抛出,或者我可以安全地抑制它的抛出?
Jes*_*per 28
正如McDowell在对templatetypdef的回答的评论中指出的那样:如果Charset在实例化new时使用对象String而不是传递charset的名称,则不必处理UnsupportedEncodingException任何其他已检查的异常:
byte[] bytes = ...;
// Requires you to handle UnsupportedEncodingException
String s1 = new String(bytes, "UTF-8");
// Doesn't require you to handle any checked exceptions
String s2 = new String(bytes, Charset.forName("UTF-8"));
Run Code Online (Sandbox Code Playgroud)
这是Java标准库中的一个不一致之处,我们不得不忍受......
请注意,Charset.forName(...)可以抛出异常(IllegalCharsetNameException,IllegalArgumentException,UnsupportedCharsetException),但这些都是unchecked异常,所以你不必赶上或自己重新扔.
编辑 - 从Java 7开始,这个类java.nio.charset.StandardCharsets具有常用字符编码的常量.例:
String s3 = new String(bytes, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
tem*_*def 13
根据Javadoc的Charset说法,每个Java实现都必须支持UTF-8以及其他一些字符集.因此,我认为你可以安全地压制异常; 除非你有一个不合规的Java实现,否则这应该不会失败.
最简单的方法是创建一个UTF-8字符集常量.然后,您不必一次又一次地捕获UnsupportedEncodingException:
public class Charsets {
public static final Charset UTF_8 = Charset.forName("UTF-8");
}
Run Code Online (Sandbox Code Playgroud)
编辑(2014-04):
使用Java 7,您不必创建自己的常量.您只需使用StandardCharsets .UTF_8即可.
它应该存在于每个Java运行时中,因此如果缺少运行时异常,则重新抛出它是合理的.不过,我不会称之为"压抑".对我来说,压制意味着捕捉异常并假装它没有发生; 如果编码丢失,不确定如何继续.
这取决于你所说的"安全"和"压制".
我很想捕获异常并AssertionError在其位置抛出未经检查的异常(或).您的应用程序可能永远不会遇到此问题.但是谁知道......有人可能会在一些不符合UTF-8的不符合要求的平台上运行它.这样做几乎没有任何成本......尤其是因为你必须对原始异常"做某事".
| 归档时间: |
|
| 查看次数: |
19462 次 |
| 最近记录: |