Разбор ошибок основного массива java [] - PullRequest
0 голосов
/ 13 июня 2009

Здравствуйте, я застрял на простом упражнении на Java, надеюсь, кто-то может помочь.

Извините, если это действительно просто, я новичок в Java.

С чем у меня проблемы: если пользователь вводит строку, отличную от «help», такую ​​как «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 ]

3 голосов
/ 13 июня 2009

Логика программы, по сути, такова: «если нулевой аргумент не« помощь », проанализируйте его как целое число & hellip;» В этот момент выдается исключение, поскольку «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 голос
/ 13 июня 2009

То, что здесь происходит, заключается в том, что код идет в блок else (как вы уже догадались), а блок else сразу пытается преобразовать параметр в число (Integer.parseInt (args [0]). добавить блок try catch для обработки таких сценариев:

public class NumberGuess {</p> <p>public static void main(String args[]){</p> <pre> 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."); }}}

Вот один из способов, которым вы могли бы написать код (только предложение).

1 голос
/ 13 июня 2009

Первое, что он делает после поиска «Справки», пытается разобрать его как число:

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)

(Не совсем уверен, что это правильный способ сделать это, но он близок.

0 голосов
/ 13 июня 2009

Как вы заметили, parseInt вызывает исключение, если вы пытаетесь проанализировать строку, которая не правильно представляет ошибку; try/catch - это Java-конструкция, предназначенная для перехвата таких исключений и работы с ними - посмотрите в ваших любимых документах Java!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...