Помощь с входами с помощью сканера - PullRequest
0 голосов
/ 09 сентября 2011
public int Remove(int i, Briefcase c[], String[] m) {

        int nChoice = 0;
        boolean inputisok = false;

        while (inputisok == false) {
            System.out.print("\tPlease remove " + i + " cases: ");
            nChoice = input.nextInt();
            if (c[nChoice] == null || nChoice < 0 && nChoice >= c.length) {
                System.out.println();
                System.out.println("\tInvalid Input please Try again\n");
            } else {
                System.out.println("\tI'm " + m[nChoice]
                        + " You just removed case # " + nChoice);
                System.out.println("\t|" + nChoice + "| contains $"
                        + c[nChoice].getAmount() + "\n");
                inputisok = true;
            }
        }
        return nChoice;
    }

моя проблема здесь в том, что когда я ввожу букву и отрицательное число или число больше 27, я всегда получаю ошибку исключения, как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Используйте метод hasNextInt () :

public int Remove(int i, Briefcase c[], String[] m) {

    boolean isNextIntCorrect = false;
    int enteredInt;

    while(!isNextIntCorrect){
        System.out.println("\tPlease remove " + i + " cases: ");
        Scanner inputScanner = new Scanner(input.next());
        if(inputScanner.hasNextInt()){
            enteredInt = inputScanner.nextInt();
            isNextIntCorrect = enteredInt >= 0 && enteredInt < c.length 
                && enteredInt < m.length)
        }
        inputScanner.close();

        if(!isNextIntCorrect){
            System.out.println("\tInvalid Input please Try again\n");
        }
    }
    System.out.println("\tI'm " + m[enteredInt]
                    + " You just removed case # " + enteredInt);
    System.out.println("\t|" + enteredInt+ "| contains $"
                    + c[enteredInt].getAmount() + "\n");
}

Таким образом, вы уверены, что имеете дело с правильным int!

0 голосов
/ 09 сентября 2011

Следующая строка неверна:

if (c[nChoice] == null || nChoice < 0 && nChoice >= c.length) {

Вы хотите изменить ее следующим образом:

if (nChoice < 0 || nChoice >= c.length || c[nChoice] == null) {

Есть два изменения: (1) && стал ||;(2) пункты были переупорядочены.

(1) && неверен, поскольку nChoice < 0 && nChoice >= c.length всегда оценивается как false, поскольку nChoice не может быть одновременно меньше нуля и больше чемc.length (Спасибо, @Aleks G!)

(2) В исходной версии вы пытаетесь получить доступ к c[nChoice], прежде чем убедиться, что nChoice находится в пределах c.Если это не так, это приведет к ArrayIndexOutOfBoundsException вместо распечатки «Неверный ввод».

Оценка короткого замыкания является причиной, по которой порядок предложений имеет значение.

Наконец, перед чтением из input вы можете вызвать hasNextInt(), чтобы убедиться, что следующий токен может быть интерпретирован как допустимое целое число.

...