捕获NumberFormatException

时间:2012-11-13 02:42:13

标签: java numberformatexception

以下是其他人写的课程。

我面临的问题是,当parse methodnull 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 个答案:

答案 0 :(得分:6)

正确的方法取决于您希望在程序中完成的任务。

  • 如果ByteAttr.getValue()稍后在您的计划中返回null,那么您的方法可行。
  • 但是,如果使用无法解释的参数(包括parse)调用null,则需要考虑是否应该抛出异常。另一种方法是捕获NumberFormatException并抛出一个在程序中具有语义含义的异常。
    public static ByteAttr parse(String rawString) throws BadAttributeException {
        ByteAttr attr = new ByteAttr();
        try {
            attr.setValue(Byte.valueOf(rawString));
        } catch (NumberFormatException nfEx) {
            throw new BadAttributeException(nfEx); // wrap original exception
        }
        return attr;
    }
  • 另一种技巧是在parse无法解读的情况下将默认值传递给rawString
    public static ByteAttr parse(String rawString, Byte defaultValue) {
        ByteAttr attr = new ByteAttr();
        try {
            attr.setValue(Byte.valueOf(rawString));
        } catch (NumberFormatException nfEx) {
            attr.setValue(default);
        }
        return attr;
    }

答案 1 :(得分:2)

你需要做四件事:

  1. 确定在您将使用该方法的上下文中,不可解析的数字字符串的含义。这是否意味着该计划的内部问题?一个腐败的档案?用户错字?没错,但是这个字符串需要以不同的方式处理?
  2. 决定处理它的最佳方法,并考虑到这一点。几乎总是,如果错误是由外部输入触发的,则需要将其报告回来。替换null 可能是处理它的好方法。
  3. 记录您的决定。如果一个方法将返回具有某些特定含义的null,那么需要将其记录为注释,最好是Javadoc通知。
  4. 实施您的决定。
  5. 我得到的印象,也许是不公平的,你已经直接跳到第4步,没有考虑可能的原因和正确的问题报告。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

同样适用于NumberFormatException的catch块,而不是将Byte属性的值静默设置为null,而应该使用适当的消息抛出异常。

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