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