1

我对使用 Junit 在 Java 中处理异常有点陌生,非常感谢一些指导。

我正在尝试做的事情:

  • 我用 a 包围了新 CustomObject 的创建,因为当我们调用时try,用户可以传入一个与 aString不匹配的a 。我希望能够在这里捕获异常,尽管有人告诉我:“应该避免捕获异常仅重新抛出异常的 catch 语句。”。必须有更好的方法来处理这个问题?enumvalueof()

  • 如果新对象正确,enum那么我调用isValidObject,它返回一个boolean. 如果Integer无效,那么我throw是一个例外。

  • 我的测试有一个@Test(expected = AssertionError.class)并且正在通过。

是否有更好/更清洁的方式来使用异常?

我有以下代码:

private CustomObject getObjectFromString(String objectDataString) {
        if (objectDataString != null) {
            String[] customObjectComponents = objectDataString.split(":");
            try {
                CustomObject singleObject = new CustomObject(EnumObjectType.valueOf(customObjectComponents [0]),
                        Integer.parseInt(customObjectComponents [1]));
                if (isValidCustomObject(singleObject)) {
                    return singleObject;
                } else {
                    throw new IllegalArgumentException("Unknown custom object type/value: " + EnumObjectType.valueOf(customObjectComponents [0]) + ":"
                            + Integer.parseInt(customObjectComponents [1]));
                }
            } catch (IllegalArgumentException e) {
                throw e;
            }

        }

哦,如果有人能推荐任何关于异常处理的好读物,那就太好了。

4

1 回答 1

5

应该避免捕获异常仅重新抛出异常的 catch 语句。”。必须有更好的方法来处理这个问题吗?

是的,只需删除 try catch。您的代码相当于:

private CustomObject getObjectFromString(String objectDataString) {
    if (objectDataString != null) {
        String[] customObjectComponents = objectDataString.split(":");
        CustomObject singleObject = new CustomObject(EnumObjectType.valueOf(customObjectComponents[0]),
                Integer.parseInt(customObjectComponents[1]));
        if (isValidCustomObject(singleObject)) {
            return singleObject;
        } else {
            throw new IllegalArgumentException("Unknown custom object type/value: " + EnumObjectType.valueOf(customObjectComponents[0]) + ":"
                    + Integer.parseInt(customObjectComponents[1]));
        }
    }
}

IllegalArgumentException如果传递给您的值enum.valueOf()无效或者您的isValidCustomObject方法返回 false ,则该代码将抛出一个错误。

请注意,IndexOutOfBoundException如果字符串不包含:您可能想要在调用之前测试的 a ,它也可能会抛出一个customObjectComponents[1]。它也可能抛出 NumberFormatException 。

而且您似乎接受空字符串作为有效条目,这可能不是一个好主意(显然取决于您的用例)。

我可能会这样写:

private CustomObject getObjectFromString(String objectDataString) {
    Objects.requireNonNull(objectDataString, "objectDataString should not be null");
    String[] customObjectComponents = objectDataString.split(":");
    if (customObjectComponents.length != 2) {
        throw new IllegalArgumentException("Malformed string: " + objectDataString);
    }

    EnumObjectType type = EnumObjectType.valueOf(customObjectComponents[0]);
    try {
        int value = Integer.parseInt(customObjectComponents[1]);
    } catch (NumberFormatException e) {
        throw new IllegalArgumentException(customObjectComponents[1] + " is not an integer);
    }

    CustomObject singleObject = new CustomObject(type, value);
    if (isValidCustomObject(singleObject)) {
        return singleObject;
    } else {
        throw new IllegalArgumentException("Unknown custom object type/value: " + type + ":" + value);
    }
}

最后,CustomObject 的构造函数自己检查它的参数是否正确可能是有意义的,而不是必须调用单独的 isValid 方法。最后一个块将只是:

    return new CustomObject(type, value);

如果需要,它将从构造函数中抛出 IllegalArgumentException。

于 2012-11-14T22:21:38.487 回答