【问题标题】:while loop with exception handling带有异常处理的while循环
【发布时间】:2013-09-21 05:31:48
【问题描述】:

这是我第一次使用异常处理,所以要温柔。我有一个接受 ID 的简单 blob 类,id 必须在 30 到 50 之间,否则会引发异常。

public class Blob {
int id;

public Blob() {

}

public Blob(int id) throws Exception {
    this.id = id;
    if (id < 30 || id > 50)
        throw new Exception ("id = " +id+ ", must be between 30 and 50 inclusive");
}
}

它应该提示用户输入一个 id,如果它不在 30 到 50 之间则抛出异常,并且应该继续直到用户输入一个有效的输入,然后简单地显示 id 号。

public class BlobCreator {

public static void main(String[] args) {
    int id;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter ID number: ");
    id = scan.nextInt();

    do {
        try {
            Blob b = new Blob(id);
        }

        catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("Enter a different ID: ");
        id = scan.nextInt();
    }
    while(true);
    }   
System.out.println("Blob ID: " +id);
}

我认为我正确地使用了 throw 和 catch,但我的循环无法正常工作,所以我认为这应该是一个简单的修复,但我无法做到恰到好处。也正在使用 while 循环,就像我对这种情况有最好的方法,还是有更好的方法来循环 throw 和 catch?

感谢大家的帮助

【问题讨论】:

    标签: java while-loop exception-handling try-catch throw


    【解决方案1】:

    抱歉,聚会有点晚了。希望最终来到这里的用户可能会发现这很有用。 不鼓励使用 break 关键字 这是一个非常简单的实现,在实现重试机制后脱离 这会在循环上迭代指定的次数,如果异常仍然存在,则抛出异常。这可以用于实际的现实世界场景,其中resttemplate 可能实际上导致 IO/网络错误,并且可以在这些情况下重试

    public class TestClass {
    
        public static void main(String[] args) throws Exception {
    
            try {
                int c = anotherM();
                System.out.println("Now the value is" + c);
            } catch (Exception e) {
                System.out.println("Inside" + e);
            }
        }
    
        public static int anotherM() throws Exception {
            int i = 4;
            Exception ex = null;
            while (i > 0) {
                try {
                    System.out.println("print i" + i);
    
                    throw new IOException();
                    // return i;
                } catch (Exception e) {
                    System.out.println(e);
    
                    i--;
                    if (i == 1) {
                        ex = new Exception("ttt");
    
                    }
    
                }
            }
            if (ex != null) {
                throw new Exception("all new");
            } else {
                return i;
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      代码执行成功后应放置break;

      do {
          try {
              Blob b = new Blob(id);
              break;
          }
          catch (Exception e) {
            System.out.println(e);
          }
          System.out.println("Enter a different ID: ");
          id = scan.nextInt();
      } while(true);
      

      因此,每次循环到达其主体的末尾时,它都会跳出循环。只有在成功创建 blob 之后才应该中断。虽然我不明白你为什么要放breakwhile 循环可以检查输入的输入是否有效并简单地停止循环。

      我在do-while 循环中修改了while...通过使用true,循环将永远运行,除非构造函数没有抛出异常...这使代码更通用(如果您修改blob-construction的条件,你不必修改while循环的条件)。

      【讨论】:

      • 是的,当我这样做时,同样的问题。
      • 即使 break 被删除,仍然连续运行,永远不会跳出循环
      • 不,您应该在构建 blob 之后引入中断,第三次修改......并添加下一个整数的扫描。这段代码至少应该要求您插入一个新整数...在进行另一次运行之前...您最好使用 do-while,否则当id 正确时不应该创建 blob .
      • 我更新了代码,似乎工作正常。注意到任何缺陷了吗?
      • 是的:如果您第一次正确输入id,您的代码将不会执行while 正文,因此不会创建blob。因此,我在do-while 循环中修改了while...通过使用true,循环将永远运行,除非构造函数没有抛出异常...这使得代码更通用(如果您修改条件对于 blob 构造,您不必修改 while 循环的条件。
      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多