java while 死循环_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 == ‘\n’) {

break;

} else if ((char) ch != ‘\r’) {

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

    原文作者:weixin_39543655
    原文地址: https://blog.csdn.net/weixin_39543655/article/details/114070350
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞