2016-09-05 3 views
1

지난 주에 Java 클래스를 시작했고 과제 중 하나는 지금까지 수업에서 배운 내용을 사용하여 두 숫자의 GCD를 사용하는 프로그램을 만드는 것입니다 (그래서 내 프로그램 아마 가장 효율적이지는 않습니다). 이것은 내 프로그램이다.Java - 누락 된 반환 오류 수신

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 문을 통해 전달되지만 메서드는이를 알 수 없다는 것을 알고 있습니다. 그래서 내 질문에 어떤 진술을 넣어야합니까? 정말 중요합니까? 내가 아직 많이 배웠기 때문에 누군가 나에게이 사실을 자세히 설명 할 수 있습니까?

+4

'return 1'을 추가하십시오. 다른 공통 분모는 없습니다. –

+2

코드에서 해당 지점으로 이동할 수있는 방법이 없다면 거기에서 예외를 throw하십시오. 예외가 트리거되지 않으면 모든 것이 잘됩니다. 그럴 경우, 방법이 예상대로 작동하지 않는다는 것을 의미하며, 큰소리로 불만을 제기하는 것이 좋습니다. – yshavit

+0

@yshavit 어떻게 예외를 throw합니까? 죄송합니다. 아직 자바에 대해 많이 알지 못합니다. – Srm

답변

1

나는 여기서 "배울 교훈"은 1을 돌려 주어야한다고 직접 생각하지 않는다고 생각합니다. 또는 루프를 추가로 재 작업하십시오.

핵심 요소는 다음과 같습니다. 어떤 시나리오에서든 숫자는 for 루프의 if 문을 통과하지만 메서드는이를 알 수 없습니다.

요점은 다음과 같습니다. 귀하의 프로그램은 알고리즘의 표현입니다. 그 프로그램의 각각의 그리고 모든 진술은 "절대적인"의미를 만들어야합니다. 예, 때로는 프로그래밍 언어가 제한됩니다. 컴파일러를 행복하게 만드려면 뭔가를 작성해야합니다. 그러나 그것은 일반적으로 나쁜 징조입니다. 즉, 코드에 대해 더 많은 시간을 할애해야합니다. 다른 말로하면 : 어떤 프로그램이라도 가능한 한 자연스러운 것으로 읽어야합니다. 프로그램에서 의미가있는 것만 수행합니다.

그래서

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

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

같은, 당신은 당신의 방법 어떤 시점에서 루프 문에서 반환과 의지 결코이 방법의 끝에 도달해야한다는 것을 이해한다면, 다음 해결책}

은 "모두"에게 무슨 일이 일어나는지 알려주는 역할을합니다. 컴파일러는 누락 된 수익을 처리 할 수있는 방법을 가지고 있습니다. 인간 독자는 또한이 구조의 목적을 쉽게 이해합니다.