【问题标题】:Nested Loops Won't Work In Java Program嵌套循环在 Java 程序中不起作用
【发布时间】:2011-03-18 22:46:37
【问题描述】:

我正在使用 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 的第一个实例,其余的为空。我怎样才能让程序留在这个循环中并让它保持错误检查?

【问题讨论】:

    标签: java for-loop


    【解决方案1】:

    您的done1 变量在第一个循环之后仍然是true,导致后续的while 语句不会进入循环体。

    最好完全消除done1 变量,并使用如下结构:

    for (...) {
        while (true) {
            try {
                // get user input
                break;
            } catch (Exception e) {
                // ..
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      done1 设置回false。或者插入done1 = false作为主for循环的第一行。

      【讨论】:

        【解决方案3】:

        for 循环中简单地放置另一个try catch 块可能是最简单的。当抛出异常时,它会使用for循环的catch并继续迭代。

        类似这样的:

        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
        

        【讨论】:

        • 你根本不应该对这类事情使用异常。
        • @Martin 为什么不呢?我可以看到这是一种将错误处理与算法分开的干净方法。据我们所知,以后他可能想做日志记录之类的,可能是很多行代码。
        • 如果必须的话,您可以在现场轻松调用 Logging 方法 - 但我们真的会记录我们丢弃的无效数据吗?例外情况有例外。
        • 虽然我正在讨论它 - 永远不要直接使用 Exception 抛出和捕获 - 任何其他形式的异常也会在此处触发您的 Catch 代码。总是,总是继承它。
        • 异常不仅适用于“异常”情况,而且是一种以对开发人员有意义的方式组织错误的方法。它们是使用 if 语句检查错误代码的答案。进行一系列 if 检查只是为了向用户显示错误消息,这很愚蠢。现代计算机的例外情况很便宜,所以担心性能是愚蠢的。虽然我正在谈论它,但下次我想回答一个简单的问题时,我一定会写一大堆异常类。
        【解决方案4】:

        第一次进入 while 循环时,!done1 表达式的计算结果为 true,因为 done1 为 false。最后你将 done1 设置为 true。当您评估 !done1 以再次执行循环时,表达式现在为 false,因为您在第一遍中将 done1 设置为 true。

        【讨论】:

          【解决方案5】:

          您没有正确使用异常...

          异常是处理此类逻辑的一种非常昂贵的方法,而您仅创建非特定异常并使用它的方法是错误的。异常是为处理程序中可能发生的异常事件而设计的——资源不可用、连接超时——诸如此类。

          您正在查看的问题应该仅通过流量控制来解决。

          希望这会有所帮助...

          马丁。

          附言。您的代码(将异常替换为更合理的代码)可能如下所示:

          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
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-02
            • 2017-06-01
            • 1970-01-01
            相关资源
            最近更新 更多