方法级别的变量范围

时间:2013-03-10 06:30:50

标签: java variables methods scope

我是Java的初学者,在练习时遇到了这些错误,所以我想澄清它们,而不是试图记住错误以避免错误。

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

这会生成a cannot find symbol,但我认为我在int循环中将结果初始化为if

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循环之外声明结果时,错误消失了。那是为什么?

3 个答案:

答案 0 :(得分: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;
} 

答案 1 :(得分:1)

本地变量称为 local ,因为它们只能在创建它们的中看到。

块是{ ... }内的任何代码。

让我们看看您在第一个版本中拥有的块:

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类消失了。

答案 2 :(得分:0)

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

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