2016-11-14 7 views
0

첫 번째 게시물 그래서 내 사과는 이것이 잘못 수행 된 경우 (또한 프로그래밍에 비교적 익숙하지 않으므로 아무 관계없는 팁도 높이 평가됩니다).Java - 시도/캐치 NumberFormatException은 이전 값을 사용합니까?

그래서 저는 Java로 기본 계산기 프로그램을 작성했습니다. 현재 잘 작동하지만 NumberFormatException과 관련된 특정 문제가 있습니다. 여기 코드는 다음과 같습니다

private static double spaceTestAndConvert(String numInput){ 

    Scanner input= new Scanner(System.in); 

    if (numInput.equalsIgnoreCase("quit")){ 
     System.exit(1); 
    } 
    else if(numInput.equalsIgnoreCase("C/E")){ 
     Restart(); 
    } 

    try{ 
     return Double.parseDouble(numInput.trim()); 
    } 
    catch(NumberFormatException nfe){ 
     numInput = ""; 
     System.out.println("Please enter only one number without any spaces or letters: "); 
     numInput = input.nextLine(); 
     spaceTestAndConvert(numInput.trim()); 
     return Double.parseDouble(numInput.trim()); 
    } 
} 

문제는 NumberFormatException이를 야기하는 여러 가지 입력에 입력 한 다음 유효한 입력에 입력하여 오류를 강제로 시도 후, 프로그램은 이전의 잘못된 입력을 인용하는 경우는 NumberFormatException에서 충돌 것입니다 .

I.E. -

"1 2 3" 
loops back 
"1 2 q 3" 
loops back 
"12q3 3 sqw 1" 
loops back 
"12" 
crash - Exception in thread "main" java.lang.NumberFormatException: For input string: "12q3 3 sqw 1" 

예외가 여러 번 발생한 후에 만 ​​발생합니다. 왜 이렇게하는지 궁금합니다. 이 문제를 해결하는 방법에 대한 조언이나 일어난 일에 대한 설명이 있습니까? 코드의 다른 부분이 필요하면 알려주십시오. 감사!

+0

"3 12q3"을 입력 할 때 충돌이 발생합니까? – Matt

+1

return spaceTestAndConvert (numInput.trim())을 반환하겠습니까? – kirbyquerby

+0

아니요. 적어도 처음 들어서는 시도는 아닙니다. 여러 번 입력 한 다음 유효한 입력을 입력하고 추락했습니다 (질문의 예와 유사). @kirby - Nah. 유효한 입력을 얻으면 문자열을 이중으로 구문 분석해야합니다. 그리고 그 가치를 되돌려 놓습니다. –

답변

2

당신은 반복적으로 spaceTestAndConvert 함수를 호출하지만, 멀리 던지고있다 ...

spaceTestAndConvert(numInput.trim()); 
return Double.parseDouble(numInput.trim()); 

을 나는 당신이 말하고있는 모든 것을 수행하지 않지만, (당신의 catch 블록 내에서)이 2 개 라인은 문제보고 가치. 나는 왜 당신이 그것을 부르고 가치에 관심을 가지지 않을지 이해하지 못합니다.

두 번째 줄 또한 엉망입니다. try/catch를 사용하여 첫 번째 호출을 Double.parseDouble()으로 신중하게 감추었지만 catch 블록에서 다시 호출합니다. 두 번째 Double.parseDouble()NumberFormatException을 생성하면 잡히지 않습니다.

+0

감사합니다. Drew! 그것이 문제였습니다. try/catch (그리고 그 문제에 대한 재귀)를 사용하여 처음으로,하지만 그것은 모두 고정되어 작동합니다. –

+0

예. 이 두 줄을'return spaceTestAndConvert (numInput.trim()); '로 바꾸면 모두 잘 돌아갑니다. –

0

캐치 리턴을 제거하면 문제가 해결됩니다. 왜냐하면 당신이 그것에 복귀한다면, 당신은 잡기 때문에 유효하지 않은 숫자 형식을 반환 할 것이기 때문입니다. 당신이하고 싶은 것은 지금 유효 할 때 값을 반환하는 것입니다, 당신은 지금 실제로 try 안에서 그것을하고 있습니다. 프로그램에 오류가있는 값을 반환하도록 강요하지 마십시오 (catch에 있기 때문에). 실제로 오류가 발생하기 때문입니다.

(재귀 때문에) 올바른 값을 얻은 후에 이전 방법으로 돌아가는 것은 다른 변수이기 때문에 최종 파트에서 얻은 성공 값을 제외하고 오류 값 스택을 계속 유지합니다.

private static double spaceTestAndConvert(String numInput){ 

Scanner input= new Scanner(System.in); 

if (numInput.equalsIgnoreCase("quit")){ 
    System.exit(1); 
} 
else if(numInput.equalsIgnoreCase("C/E")){ 
    Restart(); 
} 

try{ 
    return Double.parseDouble(numInput.trim()); 
} 
catch(NumberFormatException nfe){ 
    numInput = ""; 
    System.out.println("Please enter only one number without any spaces or letters: "); 
    numInput = input.nextLine(); 
    spaceTestAndConvert(numInput.trim()); 
} 
}