参数是硬编码时的Java异常处理

3 java api exception

关于在Java中创建API,我有一个设计级别的疑问.假设我有一个课程如下: -

class Test
{
  public final static String DEFAULT_ENCODING = "utf-8";

  public byte[] encodeIt(String input)
  {
    try {
      return input.getBytes(DEFAULT_ENCODING);
    } catch(UnsupportedEncodingException e) {
      // do something
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道,UnsupportedEncodingException因为我使用静态字符串作为输入,所以永远不会出现toBytes.encodeIt做一个没有意义,throws UnsupportedEncodingException因为我不希望API用户期望并捕获该错误.

在这种情况下,最好的做法是使用空挡块吗?

JB *_*zet 5

我做这样的事情:

public byte[] encodeIt(String input) {
    try {
        return input.getBytes(DEFAULT_ENCODING);
    }
    catch (UnsupportedEncodingException e) {
        throw new ShouldNeverHappenException(e);
        // or: throw new IllegalStateException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

(当然,ShouldNeverHappenException是运行时异常).

这样,如果有人碰巧更改了常量值,或者添加了编码参数,该方法将快速失败,并且问题不会被忽视或隐藏在日志文件中.


joo*_*ten 5

拥有空的catch块是个坏主意.即使你的推理看起来是正确的,这个设计在某个阶段会导致你无休止的调试和搜索,一旦异常开始发生,你的代码就会吞下它们.我会把你的异常包装在RuntimeException中并抛出它.像这样:

public encodeIt(String input)
  {
    try {
      return input.getBytes(DEFAULT_ENCODING);
    catch(UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  }
Run Code Online (Sandbox Code Playgroud)

这样,您的异常将不会隐藏,如果它发生也不会,您的API用户必须满足它.