【问题标题】:Parsing java main args[] array errors解析 java main args[] 数组错误
【发布时间】:2009-06-12 23:58:18
【问题描述】:

您好,我被困在一个简单的 Java 练习上,希望有人能提供帮助。

对不起,如果这真的很简单,我是 java 新手。

我遇到的问题:如果用户输入“帮助”以外的字符串,例如“foo”,那么我会收到以下错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "foo"

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)

at java.lang.Integer.parseInt(Integer.java:447)

at java.lang.Integer.parseInt(Integer.java:497)

at NumberGuess.main(NumberGuess.java:10)

我认为正在发生的事情:“foo”没有被“else”捕获,因为 args[0] 是一个对象引用,而不是真正的字符串。

我想知道的:如何捕捉除“帮助”或数字“1”到“5”以外的所有内容?

这里是代码...

public class NumberGuess {

public static void main(String args[]){

    int r;
    int g;

    if ((args[0].compareTo("help")) == 0){
        System.out.println("Enter a number between 1-5 to play.");
    } else if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){

        r = ((int)(Math.random()));
        g = Integer.parseInt(args[0]);

        if (r == g){
            System.out.println("YOU WON!");
        } else {
            System.out.println("Wrong: number was " + r);
        }

    } else {
        System.out.println("Something went horribly wrong.");

    }}}

【问题讨论】:

  • 仅供参考,对于更复杂的参数解析,我建议使用 commons-cli。

标签: java command-line


【解决方案1】:

程序逻辑本质上是,“如果参数 0 不是 'help',则将其解析为整数……”此时,抛出异常,因为“foo”不是有效整数。

最简单的方法是捕获NumberFormatException 并打印更有用的消息。

if ("help".equals(args[0])) {
  System.out.println("Enter a number between 1 and 5 to play.");
}
else {
  int number;
  try {
    number = Integer.parseInt(args[0]);
  }
  catch (NumberFormatException ex) {
    System.out.println("Input is not an integer: " + args[0]);
    return;
  }
  if ((number < 1) || (number > 5)) {
    System.out.println("Number out of bounds: " + number);
    return;
  }
  int r = new java.util.Random().nextInt(5) + 1;
  if (number == r)
    System.out.println("You won!");
  else
    System.out.println("You lost!");
}

【讨论】:

  • 谢谢 :) 并感谢大家的快速解答,真的非常棒
【解决方案2】:

这里发生的情况是代码进入 else 块(如您所料),并且 else 块立即尝试将参数转换为数字 (Integer.parseInt(args[0])。所以,您可以添加一个 try catch 块来处理这种情况:

public class NumberGuess {

public static void main(String args[]){

 int r;
    整数克;
    国际温度;

    if ((args[0].compareTo("help")) == 0){
            System.out.println("请输入 1-5 之间的数字进行播放。");
    } 别的 {
            尝试{
                temp = Integer.parseInt(args[0]);
            }catch(NumberFormatException e){
                System.out.println("请输入一个数字");
                System.exit(-1);
            }
            if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) 

这是编写代码的一种方法(只是一个建议)。

【讨论】:

    【解决方案3】:

    它在寻找“帮助”后做的第一件事是尝试将其解析为一个数字:

    g = Integer.parseInt(args[0]);
    

    您可以尝试通过将该行更改为来捕获此异常:

    try {
        g = Integer.parseInt(args[0]);
    } catch(NumberFormatException e) {
        System.out.println("The first parameter was supposed to be a number!");
        System.exit(1);
    }
    

    如果您打算接受像“foo 1”这样的参数,那么您应该将 args[1] 解析为数字,而 args[0] 您应该测试它是否是这样的“foo”:

    if(args[0].equalsIgnoreCase("foo")) {
        // now we know foo is the first arg.  Parse args[1]!
        ...
    } 
    

    哦,顺便说一句。大多数语言中的“随机”数字是介于 0 和 1 之间的数字。它们通常看起来像“.108937190823...”

    如果要检查 1-10 之类的数字,则需要执行以下操作:

    Random().nextInt(10) + 1;  // (Thanks @mmyers)
    

    (不完全确定这是正确的方法,但很接近。

    【讨论】:

    • 正确的做法是创建一个 java.util.Random 对象并在其上调用 nextInt(10)。这给出了 [0,9] 范围内的 int,然后您可以将其加 1。
    • @mmyers 谢谢!在 java 上没有过多地弄乱 Random ——很高兴知道。
    • 请参阅java.sun.com/docs/books/effective/excursion-random.html 了解关于 nextInt(int) 中使用的算法的说明。真的很投入。
    【解决方案4】:

    如您所见,parseInt 会在您尝试解析不能正确表示错误的字符串时引发异常; try/catch 是用于捕获此类异常并进行处理的 Java 构造——在您最喜欢的 Java 文档中查找它!

    【讨论】:

    • 实际上是 Java 中的 try/catch。
    猜你喜欢
    • 2010-10-18
    • 2018-04-26
    • 1970-01-01
    • 2019-03-19
    • 2011-10-17
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多