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

标签 java validation input error-handling return-value

所以我和我的 friend 正在用 Java 编程 Blackjack,我们想测试我们的输入字段是否正确输入(例如仅输入数字)。所以我们坐在他的电脑前,他写了这个解决方案:

    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;
}

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

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

提前致谢!

编辑1: 正如一些人已经提到的,你说我的方法不是在单一责任原则之后建立的。 但是,如果分成“checkInputIsnumber”和“checkInputIsString”,第一个解决方案(我的 friend )仍然是“更好”的解决方案吗?

编辑2: 更好的定义是,该方法应该具有低圈复杂度、易于阅读并且易于长期维护。

最佳答案

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

  1. 单一职责:您应该避免创建执行多项任务的方法。
  2. 开闭原则:您的“验证”是不可扩展的。尝试创建一个 Validator 接口(interface),然后为每个验证类型创建一个实现。
  3. Switch 语句会增加圈复杂度并使测试变得更加困难。

另外,不要到处使用 textField.getText(),它很可能在调用之间发生变化。将其分配给局部变量,或者更好地使用 String 作为参数,而不是 JText。正如 Fildor 指出的那样,您正确地避免使用异常进行流量控制,并且拥有单个返回点确实更好。话虽如此,对于简单的情况,只需解析/检查并返回,这是可以接受的。

关于带返回值的 Java 错误/异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185798/

相关文章:

javascript - 如何防止用户在文本框中开头输入空格?

javascript - Angular 路线/输入自动对焦

java - 带舍入值的大十进制转换

java - 如何验证字符串路径在java类中是否有效

linux - xmllint 无法验证 XHTML 1.0 过渡文件

php - 使用 php 设置时输入值不可见

php - 在 Laravel 中同时保存数据和附加

java - 安卓提醒 Intent

java - 如何使用斯坦福大学的 CoreNlp 获得词嵌入?

java - 递归方法创建Json对象