2013-05-23 2 views
1

문자열 식 (예 : "6 + 10 * 2-5")을 구문 분석하고 for- case 문. 그러나 오류가 나타납니다 :java.lang.NumberFormatException : 입력 문자열 : 구문 분석 문자열 표현

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:470) 
    at java.lang.Integer.parseInt(Integer.java:499) 
    at Calculator.random(Calculator.java:50) 
    at Calculator.main(Calculator.java:210) 

아이디어가 있으십니까?

public static double random(String exp) { 
    double primeResult = 0; 
    for (int i=0; i<exp.length();i++) { 
     double left = Integer.parseInt(exp.substring(0,i)); 
     double right = Integer.parseInt(exp.substring(i+1,i+2)); 
     switch(exp.charAt(i)) { 
      case '*': 
      primeResult = left * right; 
      break; 
     case '/': 
      primeResult = left/right; 
      break; 
     case '+': 
      primeResult = left + right; 
      break; 
     case '-': 
      primeResult = left - right; 
      break; 
     default: 
      return 0; 
     } 
     System.out.println(primeResult); 
     } 
     return primeResult; 
    } 
} 
+0

그렇게하지 않으면, ScriptingEngine이 적은 수의 라인에서보다 안정적으로이를 수행 할 수 있습니다. – assylias

+1

이 기술은 연산자 우선 순위를 처리하지 않기 때문에이 문제를 해결할 때라도 잘못된 대답을 제공한다는 것을 이해해야합니다. '(6+ (10 * 2)) - 5'보다는'((6 + 10) * 2) -5'로 평가할 것입니다. 기본적으로 여기에 '문자열 식을 구문 분석하려는'설명에 해당하는 것이 없습니다. 당신이하는 일은 잘못 스캔하는 겁니다. '재귀 적 하강 표현 구문 분석 ', Dijkstra'shunting-yard algorith '등을 찾아 보거나 @assylias가 제안하는대로'ScriptingEngine'을 사용해야합니다. – EJP

답변

8

귀하의 문제는 switch/case과는 아무것도이 없습니다. 문제는 빈 문자열을 숫자로 파싱하려고한다는 것입니다. 빈 문자열이있는 이유를 해결 한 다음 해결하십시오. (힌트 : 당신이 기대하는 것을 exp.substring(0, 0)이 돌아갑니다?)

iexp.length() - 1 (또는 exp.length() - 2) 때 당신은 또한 당신이 돌아 exp.substring(i+1,i+2)을 기대하는 것을 고려해야한다.

또한, 단계를 철회하고이이 switch/case 부분에 문제라고 생각하는 이유을 고려하십시오. 스택 트레이스를 살펴보십시오. switch/case 문 내에 있지는 않지만 그 앞에 있습니다. 오류가 실제로 발생하는 곳을 진단 할 수 있어야합니다. 따라서 문제에 집중하고 관련없는 부분에주의를 분산시킬 필요가 없습니다.

+0

random ("5 + 5")를 사용하여 main에서 메소드를 호출합니다. – user2297666

+1

@ user2297666 : 네,'exp.substring (0, i)'를 파싱하려고합니다. –

+0

'Integer.parseInt (exp.substring (i + 1, i + 2)); ' –

1

Jon Skeet이 (가) 매우 훌륭한 진단 교육을 통해 질문에 답변했습니다.

하지만 ... 문제에 대한 해결책이 효과가 없을 것 같습니다. 스루 내가 == 0 (처음으로

double left = Integer.parseInt(exp.substring(0,i)); 
double right = Integer.parseInt(exp.substring(i+1,i+2)); 

:

당신이 정신적으로 "5 + 5"의 적절한 입력을 가정, 당신의 코드를 추적하면

는 루프 가장 먼저해야 할 일은 이것이다

double left = Integer.parseInt(exp.substring(0,0)); 
double right = Integer.parseInt(exp.substring(0+1,0+2)); 

이 즉시 문제의 예외를 throw exp.substring(0,0)에 대해 "빈 문자열"을, 얻을 것이다 : 루프)이 번역됩니다.

아, 표현식을 평가하는 경우 함수가 "임의"라고하는 이유는 무엇입니까?