2013-03-10 65 views
2

我是Java的初學者,在練習時遇到了這些錯誤,所以我想澄清它們,而不是試圖記住錯誤以避免它們。變量的方法級別範圍

public static int gcd(int a, int b) { 
    if(a > b) { 
    int result = a % b; 
    } 
    return result; 
} 

這產生了我a cannot find symbol,但我想我初始化結果作爲if循環int

public static int gcd(int a, int b) { 
    if(a > b) { 
    int result = a % b; 
    return result; 
    } 
} 

爲此,如果我在if循環中返回結果,它是錯誤的,因爲它繼續循環?

public static int gcd(int a, int b) { 
    int result = 0; 
    if(a > b) { 
    result = a % b; 
    } 
    return result; 
} 

if循環之外聲明結果錯誤消失。這是爲什麼?

+1

此外,如果不是一個循環。這是一個條件。循環是一個構造,允許您重複一個操作的數量或期望的時間... – Thihara 2013-03-10 06:38:55

回答

1

局部變量被稱爲當地,因爲他們只能在他們在被創造。

塊是內部{ ... }任何代碼中可以看出。

讓我們看看你在第一個版本的封鎖:

public static int gcd(int a, int b) { // first block starts here 
    if(a>b) { // second block, an inner block, starts here 
     int result=a%b; 
    } // second block ends here 
    return result; 
} // first block ends here 

所以,在新建塊的局部變量,並儘量在室外使用阻斷,即在第一個塊。這正是編譯器所抱怨的。變量result種消失後第二個塊完成。

+0

但是這個變量結果我創建,我只希望它們在if循環內。所以我在if循環內創建。 – user2148463 2013-03-10 06:33:45

+0

@ user2148463如果在循環內部創建變量。它不會在該循環之外訪問。 – 2013-03-10 06:35:53

+0

實際上,你確實希望在if區以外,因爲你從if區以外返回它。換句話說,你從外部塊訪問它,外部塊需要知道變量。 – 2013-03-10 06:36:32

4

這與變量result的範圍有關。當它位於if內時,當您離開if})時,它停止存在。

public static int gcd(int a, int b){ 
    int result = 0; 
    if (a > b) { 
     result = a % b; 
    } 
    return result; 
} // result exists until here 

public static int gcd(int a, int b){ 
    if (a > b) { 
     int result = a % b; 
    } // result exists until here 
    return result; // result doesn't exist in this scope 
} 

基本上可以只在那裏它們被限定的代碼塊內訪問變量的代碼塊是由大括號{ ... }定義。

您的函數的替代實現可以完全沒有變量。

public static int gcd(int a, int b){ 
    if (a > b) { 
     return a % b; 
    } 
    return 0; 
} 
+0

我現在看到了圖片。非常清楚。非常感謝!(: – user2148463 2013-03-10 06:35:29

+0

@ user2148463沒問題,請確保通過點擊打勾關閉問題。 – 2013-03-10 06:36:08

+0

@Tririar,在計算器中不會調用* closing * ,但*接受答案*。問題在接受答案後仍然開放。 – 2013-03-10 06:38:26

0

的原因第一個錯誤是,if語句建立變量一個新的上下文。 result的聲明在if的正文之外是不可見的。

在第二種情況下,可能無法滿足if條件,在這種情況下,函數將不會執行return語句。這也是一個錯誤,因爲函數需要爲每個執行路徑返回一個int(或拋出一個異常)。