Nhìn vào while
vòng lặp vô hạn sau trong Java. Nó gây ra lỗi thời gian biên dịch cho câu lệnh bên dưới nó.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
while
Tuy nhiên, cùng một vòng lặp vô hạn sau đây hoạt động tốt và không gây ra bất kỳ lỗi nào mà tôi vừa thay thế điều kiện bằng một biến boolean.
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
Trong trường hợp thứ hai, câu lệnh sau vòng lặp rõ ràng là không thể truy cập được vì biến boolean b
là true, trình biên dịch không phàn nàn gì cả. Tại sao?
Chỉnh sửa: Phiên bản sau của while
bị mắc kẹt vào một vòng lặp vô hạn là hiển nhiên nhưng không có lỗi trình biên dịch nào cho câu lệnh bên dưới nó mặc dù if
điều kiện trong vòng lặp luôn luôn false
và do đó, vòng lặp không bao giờ có thể trở lại và có thể được xác định bởi trình biên dịch tại thời gian biên dịch của chính nó.
while(true) {
if(false) {
break;
}
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
while(true) {
if(false) { //if true then also
return; //Replacing return with break fixes the following error.
}
System.out.println("inside while");
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
while(true) {
if(true) {
System.out.println("inside if");
return;
}
System.out.println("inside while"); //No error here.
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
Chỉnh sửa: Điều tương tự với if
và while
.
if(false) {
System.out.println("inside if"); //No error here.
}
while(false) {
System.out.println("inside while");
// Compiler's complain - unreachable statement.
}
while(true) {
if(true) {
System.out.println("inside if");
break;
}
System.out.println("inside while"); //No error here.
}
Phiên bản sau của while
cũng bị mắc kẹt vào một vòng lặp vô hạn.
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
Điều này là do finally
khối luôn được thực thi mặc dù return
câu lệnh gặp phải trước nó trong try
chính khối.