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 的應用
/**
* 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!
Process finished with exit code 0
while(true) ... break 結構有其等價的格式
//todo:do something
... 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
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