zoukankan      html  css  js  c++  java
  • java while (true) 死循环

    true 即表示为真。因此while(true) 是一个无限循环,因为表达式的值一直为真。为了跳出循环,循环体内部要用break语句来跳出。例如,可以在循环体内部用if来判断,if(x==5)break;用exit也可以跳出,此时表示了函数直接返回​

    1、在java网络通讯的程序里原本有一段是这样的:

    while(in.readLine()!=null){

    String aa=in.readLine();

    }

    结果发现读取老是错误,后来我试了用下面的方法

    while(true){

    String aa=in.readLine();

    }

    结果读取成功!这程序咋一看差不多,我们考虑第一个程序,当程序读到,while(in.readLine()!=null)的时候,程序发生了阻塞,等待读入,如果读入成功,就执行下一个循环,下一个已开始也是阻塞,接着再读入,如此反复。而第二个是一开始就循环,但是读到String aa=in.readLine()的时候也发生阻塞,也是读入后才发生后面的事情,然后再循环,表明上看好像是一样的,但是结果为什么不一样呢!!!

    后来我才弄明白,原来第一个在读到while(in.readLine()!=null)的时候,如果有数据,那么执行String aa=in,readLine()的时候程序会继续往下读,也就是第一个while里面的读入被抛弃了,如果程序读入的只有是一行的话,那么这行就不会读入!!

    2、while(true) ... break 的应用

    在程序中,常常有一些无限循环的情况,比如当一个程序没有异常发生的时候,让循环一直执行。比如要计算PI的值,当发生异常的时候终止循环,这时候就需要while(true) ... break 着种结构。这不是新语法,也不算新用法。算得上一种不常见的能解决特殊问题的用法。

    下面举例说明,比如要获取控制台输入字符串,然后将获取的字符串打印出来。可以这么写:

    import java.io.IOException;

    public class ConsoleInput {

    public static void main(String[] args) {

    int ch;

    StringBuffer sb = new StringBuffer();

    System.out.print("请您输入一字符串:");

    while (true) {

    try {

    ch = System.in.read();

    if (ch == -1

    (char) ch == ' ') {

    break;

    } else if ((char) ch != ' ') {

    sb.append((char) ch);

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    System.out.println("您输入的字符串是:" + sb.toString());

    }

    }

    运行结果:

    请您输入一字符串:Hello Java!

    您输入的字符串是:Hello Java!

    Process finished with exit code 0

    while(true) ... break 结构有其等价的格式

    for(;;){

    //todo:do something

    ... break;

    }

    但是这些结构的特点就是死循环,并且当某种条件发生的时候,结束循环。

    终止条件是必须的,否则编译会出错。

    终止条件可以是一个条件表达式,比如if语句。也可以是一个try...catch的语句块,在异常发生时候,在catch语句中break----终止掉循环。

    比如:

    public class ConsoleInput {

    public static void main(String[] args) {

    for(int x=10;;x--){

    try{

    System.out.println(10/x);

    }catch(Exception e){

    e.printStackTrace();

    break;

    }

    }

    }

    }

    运行结果:

    1

    1

    1

    1

    1

    2

    2

    3

    5

    10

    java.lang.ArithmeticException: / by zero

    at ConsoleInput.main(ConsoleInput.java:12)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

    at java.lang.reflect.Method.invoke(Method.java:585)

    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)

    Process finished with exit code 0

    从上面可以结果可以看出,发生异常也可以作为循环终止条件。​​

    http://blog.csdn.net/haiyan2012/article/details/6906047

  • 相关阅读:
    Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1
    Codeforces 796C. Bank Hacking
    Codeforces 792B. Counting-out Rhyme
    gym 101164 H.Pub crawl 凸包
    hdu 6053 TrickGCD 筛法
    hdu 6041 I Curse Myself 无向图找环+优先队列
    bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
    codeforces gym 101164 K Cutting 字符串hash
    树链剖分求lca
    UESTC 1697 简单GCD问题(一) 筛法
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480222.html
Copyright © 2011-2022 走看看