2

如果我想从args[0]数组中获取用户输入,但万一我(用户)忘记定义它,我想要一个提示出现 - 使用if块来确定数组项是否更好?是否为空,或捕获异常?那么,这是

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        if(args.length > 0) {
            foo = args[0];
        }
        else {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}

好于或差于

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        try {
            foo = args[0];
        }
        catch(ArrayIndexOutOfBoundsException e) {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}
4

6 回答 6

6

您的第一个示例仍将引发异常,因为在 if 语句中您仍在访问不存在的索引。

如果您想使用 if 语句,那么您应该检查数组的长度是否大于您尝试访问的索引,例如:

if(args.length > 0)
    foo = args[0];
于 2012-06-29T09:41:40.843 回答
4

IMO,if-else 在这种情况下更好/更快。

当你在一个方法中并且你想告诉调用者出错了,而你不能用返回值来做这件事时,就会使用抛出异常。

但正如乔恩泰勒所说,你的 if 语句不会那样工作。

于 2012-06-29T09:43:19.260 回答
4

你需要测试args.length而不是阅读args[0]

但除了该错误之外,最好使用if/else以下原因:

  • 它使代码更清晰
  • 它具有更好的性能(尽管在这种情况下不相关)
  • 没有异常情况(预计 args 数组在某些情况下可能为空,例如“用户错误”,因此代码应该能够处理它)。异常抛出应该保留给不应该发生的异常情况。
于 2012-06-29T09:49:04.250 回答
2

您真正需要的只是一行代码。

final String foo = args.length > 0? args[0] : getString("Input? ");
于 2012-06-29T09:45:26.590 回答
1

使用 if 块检查数组是否为空,方便快捷。

于 2012-06-29T09:41:57.233 回答
1

鉴于 Jon Taylor 证明的更正,我更喜欢带有 if 的版本。

不仅是为了提高速度(在你的例子中我猜这不会明显),而且因为带有 if 的代码更好地解释了它的意图,简化了代码的未来维护。

于 2012-06-29T09:45:52.687 回答