2012-10-28 2 views
0

나는 프로 시저 유형 메서드에 try-catch를 넣으려고하고 있지만 함수 유형이어야한다는 것을 95 % 확신합니다. 내가 성취하고자하는 것은 코드를 메인에서 더 짧게 만드는 것입니다. 가장 큰 생각 중 하나는 try-catch를 메서드에 넣고 메서드를 호출하는 것입니다.시도하고 방법으로 캐치

정수가 아니면 입력을 확인합니다. 예외가 발생하더라도 프로그램에서 계속 입력하면 유효성이 검사 된 입력을 "기억하지"않습니다. 다음은 내가 문제가되는 코드의 일부입니다.

import java.util.Scanner; 

    public class ch7exercise1 
{ 
public static double compound(double oA, double cI) 
{ 
    return roundCent((oA*(Math.pow((1+(percent(cI))),10)))); 
} 

public static double percent(double interest) 
{ 
    return interest/100.0; 
} 

public static double roundCent(double amount) 
{ 
    return ((Math.round(amount*100))/100.0); //100.0 is mandatory. 
} 

public static void tryCatchNum(double value) 
{ 
    while(true) 
    { 
     try 
     { 
      Scanner iConsole = new Scanner(System.in); 
      value = Double.parseDouble(iConsole.nextLine()); 
      System.out.println(" "); 
      break; 
     } 
     catch(NumberFormatException e) 
     { 
      System.out.println("NumberFormatException error has oocured. Please try again."); 
     } 
    } 
} 

@SuppressWarnings("unused") 
public static void main(String[] args) 
{ 
    boolean f = true; 
    boolean f2 = true; 
    double origAmount = 0; 
    double compInterest = 0; 
    double total = 0; 

    Scanner iConsole = new Scanner(System.in); 

    System.out.println("10 year Compound Interest Claculator\n"); 

    System.out.println("Input amount of money deposited in the bank"); 

    tryCatchNum(origAmount); 

    System.out.println("Input compouded interest rate. (If the compound interest is 3% input 3)"); 

    tryCatchNum(compInterest); 

    total = compound(origAmount,compInterest); 

    System.out.println("$"+total); 


} 

}

+0

Double은 프리미티브이므로 값으로 전달되고 참조로 전달되지 않습니다. –

+0

'double'은 프리미티브입니다. 'Double'은 객체입니다 ... – DNA

+0

그리고 객체 참조도 값으로 전달됩니다. 같은 알고리즘으로 Double을 사용하면 아무 것도 바뀌지 않습니다. –

답변

2

자바 인자는 값에 의해 전달된다 : 여기

public static void tryCatchNum(double value) 
{ 
    while(true) 
    { 
    try 
    { 
     Scanner iConsole = new Scanner(System.in); 
     value = Double.parseDouble(iConsole.nextLine()); 
      System.out.println(" "); 
     break; 
    } 
    catch(NumberFormatException e) 
    { 
     System.out.println("NumberFormatException error has oocured. Please try again."); 
    } 
} 

}

그리고는 전체 프로그램이다. tryCatchNum 메소드에 0을 전달 중입니다. 값의 사본이 메소드에 전달됩니다. 이 메서드는 자체 복사본에 새 값을 할당 한 다음 반환합니다. 따라서 원래 값은 여전히 ​​0입니다.

메서드에 아무 것도 전달하지 않아야합니다. 대신 메서드는 유효성을 검사 한 값을 반환해야합니다. 당신이 변경되므로 때 두 번 이후

double origAmount = readDoubleValue(); 
+0

그럴 것이라고 생각하지 않습니다. 어쩌면 유사하지만 내 프로그램에서'public double tryCatchNum (double value) {.... return value; }'주된 메소드'double origAmount = tryCatchNum (origAmount)'가 작동하지 않습니다.또한 다른 사람들이 말하는 double과 double에 대해서는 무엇이 있습니까? – SelfDeceit

+0

이중 게시에 불편을 끼쳐 드려 죄송 합니다만, 헤더를'public void' 대신'public double'으로 변경 한 다음'break;'를 제거하고'return value; '를 사용했습니다. 똑같은 일이 발생합니다 - "$ 0.0" 입력이 무엇이든 상관 없습니다. – SelfDeceit

+0

그래, 해결책을 찾았 어. 그것은 아주 간단했지만 당신의 결론을 미묘하게 돌았습니다. 'main'에해야만하는 것은 write :'origAmount = tryCatchNum (origAmount);'그냥 부주의 한 실수였습니다. – SelfDeceit

0

이 메서드에 값으로 전달되는 자바의 기본입니다 :

public double readDoubleValue() { 
    ... 
    return value; 
} 

그리고 주요 방법

가 : 또한, 더 적절한 방법 이름을 사용하는 것을 고려 메소드 매개 변수의 변경 사항은 메소드 호출로 전달 된 원래 변수에 반영되지 않습니다.

값으로 전달하고 참조로 전달하는 방법을 설명하는 Java 목장의 컵 이야기를 읽으십시오. http://www.javaranch.com/campfire/StoryCups.jsp

다음 기사는 Java Ranch의 Pass By Value 이야기입니다. http://www.javaranch.com/campfire/StoryPassBy.jsp

프로그램의 main 메서드에서 값에 할당 된 double을 반환하도록 메서드를 변경해야합니다.

왜 나는 사실을 확인하는 while 루프를 사용하고 있는지 궁금합니다. 입력 된 값을 double로 변환 할 수 없으면 프로그램에 무한 루프가 발생할 가능성이 높습니다.

+0

글쎄, try catch의 요점이 될 것이라고 생각합니다. 입력이 유효하다는 것을 알 때까지 루프를 돌리고 싶습니다. 그런 다음, while 루프를위한 플래그를 설정하는 것은 try & catch 메서드의 단축키로 사용할 때 너무 복잡하기 때문에이 방법을 선택했습니다. – SelfDeceit