我是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
循环之外声明结果时,错误消失了。那是为什么?
答案 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
(或抛出异常)。