0

下面是别人写的课。

我面临的问题是,当它进入parse methodwith 时null as the rawString,它正在抛出NumberFormatException

所以我想做的是,我应该抓住那个 NumberFormatException 和set the value itself as null. 那么我的做法对吗?

public class ByteAttr {

    @JExType(sequence = 1)
    private Byte value;

    public static ByteAttr parse(String rawString) {
        ByteAttr attr = new ByteAttr();
        try {
            attr.setValue(Byte.valueOf(rawString));
        } catch (NumberFormatException nfEx) {
            attr.setValue(null);
        }
        return attr;
    }

    public Byte getValue() {
        return this.value;
    }

    public void setValue(Byte value) {
        this.value = value;
    }
}
4

4 回答 4

6

正确的方法取决于你想在程序中完成什么。

  • 如果稍后在您的程序ByteAttr.getValue()中返回是有意义的,那么您的方法可能会奏效。null
  • 但是,您需要考虑是否应该parse在使用难以辨认的参数(包括 )调用时抛出异常null。另一种方法是捕获NumberFormatException并抛出一个在程序中具有语义意义的不同异常。
    公共静态 ByteAttr 解析(字符串 rawString)抛出 BadAttributeException {
        ByteAttr attr = new ByteAttr();
        尝试 {
            attr.setValue(Byte.valueOf(rawString));
        } 捕捉(NumberFormatException nfEx){
            抛出新的 BadAttributeException(nfEx); // 包装原始异常
        }
        返回属性;
    }
  • 另一种技术是在无法辨认parse的情况下将默认值传递给:rawString
    公共静态 ByteAttr 解析(字符串 rawString,字节 defaultValue){
        ByteAttr attr = new ByteAttr();
        尝试 {
            attr.setValue(Byte.valueOf(rawString));
        } 捕捉(NumberFormatException nfEx){
            attr.setValue(默认);
        }
        返回属性;
    }
于 2012-11-13T02:49:04.413 回答
2

你需要做四件事:

  1. 确定在您将使用该方法的上下文中不可解析的数字字符串的含义。这是否意味着程序中存在内部问题?损坏的文件?用户错字?没有错,但是该字符串需要以不同的方式处理?
  2. 考虑到这一点,决定处理它的最佳方式。几乎总是,如果错误是由外部输入触发的,您需要将其报告回来。替换 null可能是处理它的好方法。
  3. 记录你决定做什么。如果一个方法要返回具有某种特定含义的 null,则需要将其写为注释,最好是 Javadoc 注释。
  4. 执行你的决定。

我得到的印象,也许是不公平的,你直接跳到了第 4 步,没有考虑问题的可能原因和适当的报告。

于 2012-11-13T02:56:21.630 回答
1

您可以使用以下条件添加提前退出:

if (rawString != null) {
    return attr; // or other value you prefer
}

您还可以确保 parse 方法的调用者测试空值,并避免在空值时调用 parse。

于 2012-11-13T02:46:04.080 回答
0

这取决于您的应用程序中对空值的容忍度。如果您希望用户不将空字符串传递给该parse()方法,那么您应该进行防御性空检查并抛出异常。

if (null == rawString) {
    throw new CustomException("rawString cannot be null");
}

这同样适用于 NumberFormatException 的 catch 块,在该块中,您不应将 Byte 属性的值静默设置为 null,而应引发带有适当消息的异常。

但如果null完全可以接受,那么您应该执行防御性空检查并将 Byte 属性设置为空。NumberFormatException 当然不应该被压制,恕我直言。

于 2012-11-13T02:49:53.303 回答