Вложенные циклы не будут работать в программе Java - PullRequest
1 голос
/ 19 марта 2011

Я пишу эту программу, используя обработку исключений try-catch:

    Scanner keyboard = new Scanner(System.in);
    String[] employees = new String[5];
    boolean done1 = false;

    //input and error exception for entering employee names into an array
    for (int i = 0; i < 5; i++)
    {//begin for

        while (!done1)
        {//begin while

            System.out.println("Please enter employee's name: ");
            try
            {//begin try
                employees[i] = keyboard.nextLine();

                if (employees[i].length() == 0)
                    throw new Exception("No name was entered.");

                if (employees[i].length() >= 31)
                    throw new Exception("Name entered contains too many "
                            + "characters");

                for (int check = 0; check < employees[i].length(); check++)
                {//begin for
                    if(Character.isDigit(employees[i].charAt(check)))
                        throw new Exception("Input contains invalid "
                                + "charaters.");
                }//end for

                done1 = true;
            }//end try

            catch (Exception a)
            {//begin catch
                System.out.println("Error: " + a.getMessage());
            }//end catch

        }//end while

    }//end for

Когда я запускаю программу, она выходит из цикла for и только вводит, что первый экземпляр i и остальные остаются нулевыми. Как я могу заставить программу оставаться в этом цикле и сохранять проверку ошибок?

Ответы [ 5 ]

2 голосов
/ 19 марта 2011

Ваша переменная done1 остается true после первого цикла, в результате чего последующие операторы while не входят в тело цикла.

Вероятно, лучше полностью исключить переменную done1, ииспользуйте такую ​​структуру:

for (...) {
    while (true) {
        try {
            // get user input
            break;
        } catch (Exception e) {
            // ..
        }
    }
}
1 голос
/ 19 марта 2011

Установить done1 обратно на false.Или введите done1 = false в качестве первой строки основного цикла for.

0 голосов
/ 19 марта 2011

при первом входе в цикл while выражения! Done1 оцениваются как true, поскольку done1 имеет значение false.к концу вы установили Done1 на истину.когда вы вычисляете! done1 для повторного выполнения цикла, выражение теперь ложно, так как для первого прохода установлено значение true1.

0 голосов
/ 19 марта 2011

Вы не правильно используете исключения ...

Исключения - очень дорогой способ обработки логики, подобной этой, и ваш подход состоит в том, чтобы просто создать неконкретное исключение и использовать его неправильно. Исключения предназначены для работы с исключительными вещами, которые могут произойти в ваших программах - недоступность ресурсов, тайм-ауты соединения - подобные вещи.

Проблема, на которую вы смотрите, должна решаться простым управлением потоком.

Надеюсь, это поможет ...

Martin.

Ps. Ваш код с заменой исключений чем-то более разумным может выглядеть следующим образом:

import java.util.Scanner;
public class SOExample {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);
        String[] employees = new String[5];
        boolean done1 = false;
        String strMessage = "";
        //input and error exception for entering employee names into an array
        for (int i = 0; i < 5; i++)
        {//begin for
            done1 = false;

            while (!done1)
            {//begin while
                strMessage="";
                System.out.println("Please enter employee's name: ");
                employees[i] = keyboard.nextLine();

                if (employees[i].length() == 0)
                    strMessage = "No name was entered.";

                if (employees[i].length() >= 31)
                    strMessage = "Name entered contains too many "
                            + "characters";
                if (strMessage == ""){
                    for (int check = 0; check < employees[i].length(); check++)
                    {//begin for
                        if(Character.isDigit(employees[i].charAt(check))){
                            strMessage = "Input contains invalid "
                                    + "charaters.";
                            break;
                        }
                    }//end for
                }

                done1 = (strMessage == "");
                if (!done1){
                    System.out.println("Error: " + strMessage);
                }

            }//end while

        }//end for

    }

}
0 голосов
/ 19 марта 2011

Возможно, проще всего поместить другой блок try catch в цикл for. Когда генерируется исключение, оно будет использовать catch цикла for и продолжать итерацию.

Примерно так:

for (int check = 0; check < employees[i].length(); check++)
            {//begin for
                try {
                    if(Character.isDigit(employees[i].charAt(check)))
                        throw new Exception("Input contains invalid "
                                + "charaters.");
                }
                catch(Exception e)
                { //Handle Error
                }
            }//end for
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...