Java: инструкция Try-Catch в цикле Do-While

Я пытаюсь выполнить небольшой код, который сканирует вводимое пользователем значение. Это действие содержится в написанном мною специальном методе с именем getTriangleDim (); метод считывает значение int пользователя, проверяет, находится ли оно в определенном диапазоне, а затем возвращает введенное значение int. Метод отлично работает, и у меня нет с ним проблем.

Проблема возникает, когда я ввожу значение, отличное от int, для моего метода getTriangleDim (). Это дает мне ошибку InputMismatchException. Я написал оператор try-catch в цикле do-while, чтобы попытаться исправить эту проблему. Но это первый раз, когда я использую инструкцию try-catch, и я, очевидно, что-то упускаю.

Вот код для оператора try-catch, вложенного в цикл do-while:

//loop to scan for triangle dimension
        boolean bError = true;
        int triangle;

        do{
            try {
                triangle = getTriangleDim();
                bError=false;
                }
            catch (Exception e){
                System.out.println("You did not enter an integer, please enter an integer value");
                triangle = getTriangleDim();

                }
        }while (bError);

если я проверю его, введя значение char вместо int, он фактически перехватит ошибку один раз, а затем напечатает мой оператор «вы не ...». Но если я снова введу другой номер, не являющийся int, я снова получаю сообщение об ошибке выполнения, в котором говорится ....... вы догадались ........ Ошибка InputMismatchException.

Код моего метода здесь:

//method for scanning triangle dimensions from keyboard
    public static int getTriangleDim(){
        int triangle = 0;
        Scanner keyboard = new Scanner(System.in);
        do{
        System.out.print("Enter a non-zero integer length (+/-1 - +/-16): ");
        triangle = keyboard.nextInt();
        if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)))
            System.out.println("Inpute value outside of range");
        }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)));
        return triangle;
    }

Мне нужен цикл Do-While для продолжения, но я продолжаю получать эти ошибки.


person Community    schedule 25.02.2014    source источник
comment
Вы можете определить новое исключение class NotIntegerException extends Exception { .. } и перехватить его снаружи, чтобы отличить его от других типов исключений.   -  person Khaled.K    schedule 25.02.2014


Ответы (1)


Нет необходимости запрашивать ввод в блоке catch. Вы уже находитесь в цикле, поэтому вы можете перехватить исключение, сказать пользователю, чтобы он предоставил вам допустимый ввод, и тогда вам не нужно ничего делать - вы вернетесь к началу.

do{
    try {
        triangle = getTriangleDim();
        bError=false;
    } catch (Exception e){
        System.out.println("You did not enter an integer, please enter an integer value");
        // Don't do anything else in here: we will loop back to the beginning again and get new input!
    }
}while (bError);

В качестве примечания (и, как вы заметили), ваш код в настоящее время не будет компилироваться, если вы попытаетесь использовать triangle за пределами этого try блока, потому что "triangle might not have been initialized". Это связано с тем, что компилятор не может определить во время компиляции, что ваша программа будет делать во время выполнения: то есть компилятор не видит, что triangle всегда будет инициализироваться в этом цикле. Таким образом, ваше объявление переменной должно также установить triangle на какое-то значение по умолчанию. 0 является нормальным значением по умолчанию для int, но используйте все, что имеет смысл в вашей программе (похоже, 0 в порядке, исходя из вашего getTriangleDim кода).

int triangle = 0;
do { // etc.

Таким образом, вы можете «пообещать» компилятору, что triangle будет иметь значение к тому моменту, когда вы выйдете из цикла, и вы сможете использовать его где-нибудь еще.

person Henry Keiter    schedule 25.02.2014
comment
спасибо, теперь я чувствую себя глупо. Я обновил свой код, чтобы удалить ввод сканера в блоке catch. Но теперь я получаю другую ошибку, компилятор выдает мне следующую ошибку «Некомпилируемый исходный код» - возможно, треугольник переменной не был инициализирован. Кроме того, после моего цикла Do-while и вложенных операторов try-catch каждая ссылка на переменную traingle подчеркнута красным. Я не понимаю, кажется, моя программа не распознает, что она была инициализирована значением? - person ; 25.02.2014
comment
@Adam Компилятор не лжет! Вы видите, что он должен быть инициализирован к моменту выхода из цикла, но компилятор не могу предсказать, как будет работать ваша программа. Что касается компилятора, вы можете выйти из цикла без инициализации triangle. См. этот вопрос для примера, аналогичного вашему, но суть в том, что вы должны инициализировать triangle некоторым значением по умолчанию (0 и -1 распространены) перед циклом, в котором вы выполняете настоящее присваивание (например, int triangle = 0;). - person Henry Keiter; 25.02.2014
comment
Спасибо! Я ценю помощь. - person ; 25.02.2014