繁体   English   中英

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

[英]Java Error/Exception handling with returning 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”,第一个解决方案(我的朋友)仍然是“更好”的解决方案吗?

编辑2:更好地定义为,该方法应具有较低的圈复杂度,易读性并易于长期维护。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM