Java无限循环问题

下面两个小程序,只有一句不一样,为何一个正常,而另一个却是无限循环呢?----------------------------------------------程序1-... 下面两个小程序,只有一句不一样,为何一个正常,而另一个却是无限循环呢?
----------------------------------------------程序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("--------------------------");
}
}
}
}
展开
 我来答
qiuzhilumanman

2015-07-28 · TA获得超过175个赞
知道答主
回答量:83
采纳率:0%
帮助的人:16.9万
展开全部
程序二中: System.out.println(greetings[i]);
当你的i=3时, 就会报 ArrayIndexOutOfBoundsException 这样的一个错误,try捕获了这个错误,那么程序就会执行 catch,从而不执行 i++,所以 i 的值 一直都是3,永远小于4,所以无限循环!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
佳佳西西
2015-07-28 · 超过14用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:19.2万
展开全部
第一个不出现,是因为,先执行的是i++,当下标越界后(i=3,i++变为4),所以i>4不成立,跳出循环。
第二个出现,是因为,当下标越界后(i=3),此时i<4成立,但i++操作没有执行,因为 System.out.println(greetings[i])已经抛出异常。所以为死循环。

注意表达式的执行顺序问题,这样的问题就很好解释了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Forrest_brm
2015-07-28 · TA获得超过327个赞
知道小有建树答主
回答量:217
采纳率:100%
帮助的人:249万
展开全部
这个问题的关键在于第二个程序当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++]);里面的多个操作都(尝试)执行了再抛出,高手觉得呢?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
longxinwu888
2015-07-28 · TA获得超过134个赞
知道小有建树答主
回答量:171
采纳率:100%
帮助的人:101万
展开全部
程序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条件 程序停止。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式