關於while(true)的總結

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;

/**
* while(true) ... break 的應用
*
* @author leizhimin,2008-10-14 9:05:31
*/

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----終止掉循環。
 
比如:
/**
* while(true) ... break 的應用
*
* @author leizhimin,2008-10-14 9:05:31
*/

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
 
從上面可以結果可以看出,發生異常也可以作爲循環終止條件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章