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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM