变量的方法级别范围

问题描述:

我是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

局部变量被称为当地,因为他们只能在他们在被创造。

块是内部{ ... }任何代码中可以看出。

让我们看看你在第一个版本的*:

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

这与变量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

的原因第一个错误是,if语句建立变量一个新的上下文。 result的声明在if的正文之外是不可见的。

在第二种情况下,可能无法满足if条件,在这种情况下,函数将不会执行return语句。这也是一个错误,因为函数需要为每个执行路径返回一个int(或抛出一个异常)。