Java-接收丢失的返回错误

Java-接收丢失的返回错误,java,Java,上周我开始上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

上周我开始上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语句。我认为这是因为需要返回类型的方法必须为方法中的每个可能分支声明一个返回语句(如果我错了,请纠正我)。我知道在任何情况下,数字都会通过for循环的if语句,但该方法不知道这一点。所以我的问题是我应该放什么返回语句?这真的重要吗?有人能给我详细解释一下吗,因为我还没有学到很多东西。

如果你应该返回1,我认为这里的“要学习的课程”不是直接的;或者进一步修改循环

这里的关键元素是您所写的:我知道在任何情况下,数字都会通过for循环的if语句,但方法不知道这一点

但关键是:你的程序是一个算法的表达式。该程序中的每一条语句都必须具有“绝对”意义。是的,有时编程语言受到限制;你必须写下一些东西才能让编译器满意。但这通常是一个坏迹象。这意味着您应该花更多的时间思考代码。换句话说:任何程序都应该尽可能地“自然”阅读。你只在程序中做有意义的事情

因此,如果您知道您的方法必须在某个点从循环语句返回,并且永远不会到达方法的末尾,那么

public int whatever() {
  ... for ( ... {
    return x;
  }

  throw new RuntimeException("will never be reached");
}


告诉“每个人”发生了什么:编译器有办法处理丢失的返回;人类读者也很容易理解这个构造的目的。

Add
return 1
,不存在其他公分母。如果您确定代码中没有任何方法可以达到这一点,请从那里抛出异常。如果这个异常没有被触发,一切都很好;如果确实如此,则意味着该方法没有按您预期的那样工作,您需要一个友好、响亮的投诉来告诉您。@yshavit您如何抛出异常?对不起,我对java还不是很了解;但不了解搜索引擎则有点问题。:)我可以通过谷歌搜索你的问题(“你如何抛出异常?”)找到Oracle的页面。我甚至不需要添加“java”,尽管这通常有助于搜索java问题。我建议您在
I=2
处停止循环。目前,您知道循环永远不会结束,因为它最终将到达
i=1
,任何
%1
都是0。将循环条件更改为
i>1
,并遵循@ElliottFrisch的建议:在末尾添加
返回1
。这样就不需要检查
%1==0
。然后,您也可以将
if((bigabs==1)| |(smallabs==1))
语句作为冗余语句删除。