[英]Unreachable statement in java while loop
在這里查找“死代碼”線程時, 在Eclipse中出現了死代碼警告
我嘗試了以下簡單的Java代碼:
public class Test2
{
public static void main(String[] args)
{
int x = 0;
while(false)
{
x=4;
}
}
}
正確引發編譯時錯誤
C:\Documents and Settings\user\Desktop\Test2.java:7: unreachable
statement
{
^ 1 error
我對代碼進行了一些微調:
public class Test2
{
public static void main(String[] args)
{
int x =0;
while(true)
{
x=4;
}
}
}
編譯就可以了
是否有原因,為什么這樣編譯正常?
從邏輯上講,兩者都應引起無限循環,並且都應引起編譯時錯誤。
難道我做錯了什么?
從邏輯上講,兩者都應引起無限循環
不完全是: while(false)
永遠不會進入循環。
另外,編譯器不會警告無限循環-您實際上可能想要一個:
while(true) {
// poll some queue for work
// if work found do it
// else sleep 1 second
}
是否有原因,為什么這樣編譯正常?
為什么它不能編譯正常? 與第一個示例相反,所有語句都是可訪問的:-)
許多程序故意有無限循環。 (例如,考慮一台應該“永遠”為客戶服務的服務器。)拒絕編譯無限循環是沒有道理的。
從邏輯上講,兩者都應導致無限循環,並且都應引起編譯時錯誤。
不,只有第二個循環會導致無限循環。
只要條件為真,就會進行while
循環。 由於false
永遠不會為真,因此循環體將永遠不會執行(這就是x = 4;
在這種情況下不可訪問的原因)。
請注意,如果您這樣做...
public class Test2
{
public static void main(String[] args)
{
int x =0;
while(true)
{
x=4;
}
x = 4; <--------- unreachable!
}
}
...它不會編譯,因為循環將永遠持續下去,最后一個x = 4;
將無法到達。
通常,編譯器不會警告您無限循環,因為它們不一定是編程錯誤。
而且,從數學上講不可能對所有代碼都可靠地給出這樣的錯誤消息。 從數學上講,不可能編寫一種算法來證明任何程序是否終止或陷入無限循環。 如果您想了解詳細信息,請查找“停止問題”。
C:\Documents and Settings\user\Desktop\Test2.java:7: unreachable statement {
^ 1 error
意味着there is a code which will be never executed
while(false){ /* this place will be never reached */ }
因為while( condition
)期望condition
為true
while(true){ /* this will cause infinite loop */ }
while(false)
將永遠不會進入此循環。 所以x=4;
是無法到達的。 while(true)
再次是一個無限循環。
while(false)
永遠不會進入循環,因此無法訪問某些代碼,這就是為什么出現編譯時錯誤的原因。
while(true)
在您的示例中導致無限,因此您可能需要編譯時錯誤。 但是,您可能會在退出循環並使之合法化方面有所break
! 或者,在某些情況下(例如,對於守護程序),您可能還需要實際的無限循環。 這就是在這種情況下您沒有錯誤的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.