我上周开始学习Java课程,其中一项任务是使用我们迄今为止在课堂上学到的知识创建一个将GCD取为两个数字的程序(因此我的程序可能不是最有效的) 。这是我的计划。
import java.util.*;
public class Program {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Enter an integer");
int num1 = console.nextInt();
System.out.print("Enter an integer");
int num2 = console.nextInt();
int gcd = factor(num1, num2);
System.out.println("The GCD is " + gcd);
}
public static int factor(int num1, int num2) {
int big = Math.max(num1, num2);
int small = Math.min(num1, num2);
int bigabs = Math.max(Math.abs(num1), Math.abs(num2));
int smallabs = Math.min(Math.abs(num1), Math.abs(num2));
if (smallabs == 0) {
return bigabs;
}
if ((bigabs == 1) || (smallabs == 1)) {
return 1;
}
for (int i = smallabs ; i >= 1; i--) {
if ((num1 % i == 0) && (num2 % i == 0)) {
return i;
}
}
// This is where I need a return statement
}
}
它无法编译,因为它缺少一个return语句。我认为这是因为需要返回类型的方法必须为方法中的每个可能的分支声明一个return语句(如果我错了,请纠正我)。我知道在任何情况下,数字都会通过for循环的if语句,但方法并不知道。所以我的问题是我应该提出什么样的退货声明?真的有关系吗?有人可以向我详细解释这个,因为我还没有学到很多东西。
答案 0 :(得分:1)
我认为要学习的课程"如果你应该返回1,这里不是直接的;或者进一步修改你的循环。
这里的关键元素是你写的:我知道在任何情况下,数字都会通过for循环的if语句,但方法并不知道。
但关键是:你的程序是算法的表达。该计划中的每个和任何陈述必须使'#34;绝对"感。是的,有时编程语言受到限制;而且你必须写一些东西才能使编译器满意。但这通常是个坏兆头。这意味着您可能应该花更多时间考虑您的代码。换句话说:任何程序都应该阅读" as natural"尽可能。你只在你的程序中做有意义的事情。
因此,如果您了解您的方法必须在某个时候从循环语句返回,并且永远不会到达方法的结尾,那么像<的那样的解决方案/ p>
public int whatever() {
... for ( ... {
return x;
}
throw new RuntimeException("will never be reached");
}
告诉&#34;每个人&#34;发生了什么:编译器有办法处理丢失的返回;人类读者也很容易理解这种结构的目的。