返回值的Java错误/异常处理

时间:2018-11-07 08:30:26

标签: java validation input error-handling return-value

所以我和我的朋友正在用Java编程二十一点,我们想测试输入字段的正确输入(例如,数字输入)。因此我们坐在他的PC上,他编写了以下解决方案:

    public static boolean testeTextFieldInt(JTextField textField,  int geld) {
    if (!textField.getText().isEmpty()) {
        try {
            if(Integer.parseInt(textField.getText())>0 && Integer.parseInt(textField.getText())<geld ) {
            return true;    
            }
        } catch (NumberFormatException e) {
            return false;
        }
    }
    return false;
}

现在,我不同意此解决方案,因为您的代码不应依赖于错误,否则我会弄错吗?所以我坐下来写下:

    public static boolean checkInput(JTextField textField, int spielerGeld, String eingabe) {

    boolean matched = false;

    switch (eingabe) {

    case "num":
        if (!textField.getText().isEmpty() && textField.getText().matches("^[0-9]*$")) {

            int geldinput = Integer.parseInt(textField.getText());

            if (geldinput > 0 && geldinput < spielerGeld) {
                matched = true;
            }
        }
        break;

    case "string":
        if (!textField.getText().isEmpty() && textField.getText().matches("^[a-zA-Z]*$")) {
            matched = true;
        }
        break;

    default:
        break;
    }
    return matched;
}

请记住,我们还没有要检查的任何文本字段,但我只是实现了它,以了解如何在一种方法中进行多次检查。

所以现在我的问题是,什么代码“更好”?而我们/我能做得更好吗?

谢谢!

EDIT1: 因此,正如已经提到的那样,您说我的方法不是建立在“单一责任”原则之后的。 但是,如果将其拆分为“ checkInputIsnumber”和“ checkInputIsString”,第一个解决方案(我的朋友)仍然是“更好”的解决方案吗?

EDIT2: 较好的定义是,该方法应具有较低的圈复杂度,易读性并易于长期维护。

2 个答案:

答案 0 :(得分:1)

第一种方法比第二种方法好得多。

  1. 单一责任:您应该避免创建做多事情的方法。
  2. 开闭原则:您的“验证”不可扩展。尝试创建一个Mono.empty()接口,然后创建每个验证类型的实现。
  3. switch语句增加了循环复杂性并使测试更加困难。

此外,不要在任何地方都使用fromCallable,它很有可能会在两次调用之间改变。将其分配给局部变量,甚至最好使用Validator作为参数,而不要使用textField.getText()。正如Fildor所指出的那样,您正确地避免使用异常进行流控制,确实最好有一个返回点。话虽如此,对于简单的情况,只要您解析/检查并返回,就可以接受。

答案 1 :(得分:0)

您应该将所有检查都放在一个函数中。过了一会儿,您的“多功能一体机”将变得难以理解且难以维护。此外,如果支票属于单一功能,则更容易更改支票。对控制流使用try / catch并不是一个好主意。它在运行时很昂贵。这不是一个好的样式,大多数开发人员都不希望在catch块中有控制流。例外是针对特殊情况。