解析java main args []数组错误

时间:2009-06-12 23:58:19

标签: java command-line

你好,我被困在一个简单的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.");

    }}}

4 个答案:

答案 0 :(得分:3)

程序逻辑本质上是,“如果参数零不是'帮助',则将其解析为整数......”此时,抛出异常,因为“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!");
}

答案 1 :(得分:1)

在寻找“帮助”后,它首先要做的是尝试将其解析为数字:

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)

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

答案 2 :(得分:1)

这里发生的是代码进入else块(正如你猜测的那样)并且else块直接尝试将参数转换为数字(Integer.parseInt(args [0])。所以,你可以添加一个try catch块来处理这样的场景:

public class NumberGuess {

public static void main(String args[]){

    int r;
    int g;
    int temp;

    if ((args[0].compareTo("help")) == 0){
            System.out.println("Enter a number between 1-5 to play.");
    } else {
            try{
                temp = Integer.parseInt(args[0]);
            }catch(NumberFormatException e){
                System.out.println("Please enter a number");
                System.exit(-1);
            }
            if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){
            r = ((int)(Math.random()));
            g = Integer.parseInt(temp);

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

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

    }}}

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

答案 3 :(得分:0)

正如您所注意到的,如果您尝试解析未正确表示错误的字符串,parseInt会引发异常; try/catch是用于捕获此类异常并处理它们的Java构造 - 在您最喜欢的Java文档中查找它!