2011-10-31 52 views
2

繼承人我的簡單代碼用於測試目的。有兩件事:Eclipse對所有東西都說「必須是靜態的」!並且此方法必須返回布爾類型的結果,而它返回true

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else if (a != b) { 
     return false; 
    } 
} 

我得到的錯誤:

This method must return a result of type boolean

雖然在任何給定的時間就必須要麼返回true或false,從來都返回。此外, 不管我做什麼,Eclipse的告訴我

Cannot make a static reference to the non-static field bikeSpeed

void speedUp(){ 
    bikeSpeed++; 
} 

bikeSpeed

int bikeSpeed = 2; 

也許簡單的答案,但任何人都可以幫助嗎?我知道如何使用布爾等等,並且從來沒有遇到過問題,但最簡單的事情^^^不起作用。

編輯:我的繼承人加速:

void speedUp(){ 
    bikeSpeed++; 
} 

而且我的繼承人它的用法:

System.out.println("Simple if && if-then-else testing."); 
    if (isMoving == true) { 
     System.err.println("You're already moving fast, no need to speed up!"); 
    } else { 
     speedUp(); 
     System.out.println("Time to speed up!"); 
    } 

編輯重申:isMoving聲明,這樣是好的了,但行 如果(isMoving == true){ 給出了錯誤:isMoving無法解析爲變量。 isMoving()如果我把它切換到那個。 最後一個錯誤是

speedUp();

給出:不能讓從類型的HelloWorld

編輯最後一次的靜態引用非靜態方法加速():我恨這個補丁,因爲它似乎正確的我,但月食似乎認爲即使它沒有被靜態地使用,使每一個單變量靜態修復它(它所做的)。

+1

你確定'speedUp()'沒有被聲明爲靜態的嗎?你確定顯示的錯誤是在'speedUp()'上嗎? – amit

+0

你能粘貼全班嗎? –

+0

我的代碼加速是。 \t 'code' void speedUp(){ \t bikeSpeed ++; \t}} '/代碼' 和我對它的用法是: '代碼' \t \t如果(isMoving ==真){ \t \t \t通信System.err.println(「你已經動快,不需要加速!「); \t \t} else { \t \t \t speedUp(); \t \t \t System.out.println(「Time to speed up!」); \t \t}'/ code' – JavaNewbie

回答

3
boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else if (a != b) { 
     return false; 
    } 
} 

這裏的編譯器沒有檢測到這兩個分支之一必須受到較大沖擊,因此它認爲是有可能的狀態,你會得到該方法的末尾,沒有指定返回值。您可以使用else而不是else ifreturn a == b

這不僅僅是一個編譯器缺陷;您可能會遇到另一個線程在後臺更改ab的值的情況,並且根據時間的不同,這些條件在評估時可能都是錯誤的。

+3

或將其減少爲'boolean isMoving(){return a == b; } –

+0

@Philipp:你的評論非常快,我添加它像一分鐘後,我發佈:-) –

3

這相當於:

boolean isMoving(){ 
    return a == b; 
} 

Eclipse的抱怨,因爲它認爲,並非所有的執行路徑是手柄。嘗試:

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else if (a != b) { 
     return false; 
    } else { 
     return //a is neither equal nor not equal to b??? 
    } 
} 

注意最後一個分支實際上從未因爲如果a == b條件並不比a != b必須滿足是真實發生的。

+5

相當於在編譯器會拋出一個錯誤的語法,是的... –

+0

對不起,謝謝! –

+0

實際上,由於'a'和'b'不是本地的,所以第二個分支實際上可以計算爲false並因此被跳過。 –

2

對於此代碼:

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else if (a != b) { 
     return false; 
    } 
} 

如何將編譯器可靠地推斷出你的if語句是互補的?畢竟,不可能另一個線程(理論上)可能改變ab的值?那麼你可能會遇到你沒有返回價值的情況。

只需提供一個else(在這種情況下,用它來代替else if):

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else { 
     return false; 
    } 
} 

您也可以依靠的事實,第一return將阻止代碼的其餘部分從執行:

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } 

    return false; 
} 
0

第一個問題是有點討厭(但有一個原因 - multythreading),Java編譯器看到的是,並非所有的基地覆蓋,修復:

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } 

    return false; 
} 
在第二

您需要引用對象:

void speedUp(){ 
    this.bikeSpeed++; 
} 

編輯: 增加了多線程的信息。

查看代碼主塊中存在的靜態問題,因爲main方法是靜態的,不能引用對象變量,所以需要首先創建對象的實例,然後引用該對象的變量。

+0

一旦你引入多線程的可能性,你不能保證所有的基礎都被覆蓋。 :-) –

+0

對,沒有關於它的事情,編輯了這篇文章。 –

0

是的,有一種情況,編譯器不能告訴你永遠不會到達塊的末尾。 另外,你可以把一個返回false;在大括號之前。

0

對於你的第一個問題,如下修改代碼:

return a == b; 

關於第二個問題,有沒有在你的代碼名稱衝突?如果您使用:

void speedUp(){ 
    this.bikeSpeed++; 
} 

相反,它是否解決了您的問題?如果是,那麼你有兩個同名的變量,你不應該這樣做。

1

的第一個代碼段,你可以做

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else { 
     return false; 
    } 
} 

甚至

boolean isMoving(){ 
    return a == b; 
} 
在你原來的代碼

Java編譯器不能確定任何如果輸入條件,因此錯誤時,它可以在最後找不到回報

您還可以在末尾放置一個assert false;throw new RuntimeException();但在此情況下這不是必需的

1

你可以簡化你的代碼

return a == b 

,但它的抱怨的原因是,你的代碼就相當於

boolean isMoving(){ 
    if (a == b) { 
     return true; 
    } else if (a != b) { 
     return false; 
    } else { 
     //oh no, nothing there! 
    } 
} 

靜態參考意味着你是從什麼地方訪問類領域你沒有這個類的實例。您可以從您的main方法訪問該字段,該方法是靜態的,而不使用該類的實例。

相關問題