Java无限循环问题

下面两个小程序,只有一句不一样,为何一个正常,而另一个却是无限循环呢?
----------------------------------------------程序1-------------------------------------------------------------------------
public class TestException {
public static void main(String args[]) {
int i = 0;
String greetings[] = { " Hello world !", " Hello World !! ",
" HELLO WORLD !!!" };
while (i < 4) {
try {
// 特别注意循环控制变量i的设计,避免造成无限循环
System.out.println(greetings[i++]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界异常");
} finally {
//i++;
System.out.println(i);
System.out.println("--------------------------");
}
}
}
}

--------------------------------------------------程序2---------------------------------------------------------------------

public class TestException {
public static void main(String args[]) {
int i = 0;
String greetings[] = { " Hello world !", " Hello World !! ",
" HELLO WORLD !!!" };
while (i < 4) {
try {
// 特别注意循环控制变量i的设计,避免造成无限循环
System.out.println(greetings[i]);
i++;

} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界异常");
} finally {
//i++;
System.out.println(i);
System.out.println("--------------------------");
}
}
}
}

第1个回答  2015-07-28
程序二中: System.out.println(greetings[i]);
当你的i=3时, 就会报 ArrayIndexOutOfBoundsException 这样的一个错误,try捕获了这个错误,那么程序就会执行 catch,从而不执行 i++,所以 i 的值 一直都是3,永远小于4,所以无限循环!
第2个回答  2015-07-28
第一个不出现,是因为,先执行的是i++,当下标越界后(i=3,i++变为4),所以i>4不成立,跳出循环。
第二个出现,是因为,当下标越界后(i=3),此时i<4成立,但i++操作没有执行,因为 System.out.println(greetings[i])已经抛出异常。所以为死循环。

注意表达式的执行顺序问题,这样的问题就很好解释了
第3个回答  2015-07-28
这个问题的关键在于第二个程序当i=2时,i++ 然后变成3 进入下个循环。
greetings[3] 取值时,抛出异常 所以 i++就没有机会执行了。所以i将一直停留在3,不会递增了。

程序一
在greetings[i++] // i=2时,正常运行
greetings[3++] // 先取值,之后i变成4 ,然后抛出异常,进入catch 和finally块
退出循环
个人猜测,程序一能运行的关键在于(++)运算的优先级要高于一般的程序语句。其实程序是否运行一致,可以用javap去看下字节码,相当有用。追问

说的很有道理
我猜测:异常抛出机制可能要等到该语句System.out.println(greetings[i++]);里面的多个操作都(尝试)执行了再抛出,高手觉得呢?

本回答被提问者采纳
第4个回答  2015-07-28
程序2:当i为3时System.out.println(greetings[i]);会报异常,这时候i还是为3,直接走System.out.println("数组下标越界异常"); i++不执行;然后执行finally 打印i为3,再执行while 再抛异常,然后重复上面的操作,所以死循环。程序1:当i为3时System.out.println(greetings[i++]);也抛异常 不过 i++ 已经执行了 所以i为4 不符合while条件 程序停止。
相似回答