2013-10-26 5 views
1

이 코드는 일부 입력에 적합합니다. 하지만 1000000과 같은 높은 값의 입력에 대해서는 NumberFormatError가 발생합니다. 입력 (s []에 대해 취한 값)의 범위는 1-2000000입니다. 그 이유는 무엇입니까?큰 입력에 대한 숫자 형식 예외

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 

    public static void main(String[] args) { 
     /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ 

     try 
     { 
     BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 

     int no=Integer.parseInt(read.readLine()); 

     String s[]=read.readLine().split(" "); 

     int result=0; 

     for(int i=0; i<no; i++) 
     { 
      result+= Integer.parseInt(s[i]); 
      if(result<0) 
       result=0; 
     } 
     System.out.println(result); 

     } 
     catch(IOException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 
+3

그 예외를 준 입력 샘플을 제공 할 수 있습니까?! – SudoRahul

+0

예외의 스택 추적을 게시 할 수 있습니까? – Evans

+0

답변 중 귀하의 질문에 대한 답변이 있었습니까? 그렇다면 좋아하는 답변을 해결 된 것으로 표시하고, 그렇지 않은 경우 자세한 정보를 제공해주십시오. – Izmaki

답변

3

for 루프 내에서 첫 번째로 입력 한 숫자는 배열의 크기입니다. 그것이 당신의 논리가 지금까지의 방법입니다. 수동으로 2,000,000 개의 숫자를 실제로로드하거나 (복사/붙여 넣기) 않는 한 ArrayIndexOutOfBoundsException이 표시됩니다. 두 번째 입력 또는 숫자보다 큰 Integer.MAX_VALUE (2147483647) 또는 미만 Integer.MIN_VALUE (-2147483648)로 비 숫자를 입력한다면

당신은 NumberFormatException을 얻을 것입니다.

입력 뭔가 같은 :

1000000 
2 1 2 1 2 1 /*... 999990 digits later ...*/ 2 1 2 1 

이 프로그램이 제대로 종료 할 수 있습니다. 누군가가 원한다면 필자가 사용한 입력 파일은 다음과 같습니다. java Solution < in.txt과 같이 명령 프롬프트에서 프로그램이 수동으로 컴파일되어 실행되었습니다.

편집 : 방금 배열의 입력 값이 2000000만큼 클 수 있다는 것을 기억했습니다. result 값을 2000000^2로 유지하려면 BigInteger을 사용해야합니다.

0

나는 @lzmaki와 동의합니다. 귀하의 값에 대해 NumberFormatException을 얻지 못했습니다. 는하지만, 나는이 같은 시도 할 때 실제로 유래에서 발생 ArrayIndexOutofBoundException 얻을 : 그 시간에 같이

1000000 
1 2 3 
then enter 

을, 시스템은 데이터의 유지와 같은 엄청난 수에 대한 스택에서 충분한 메모리가 인식하고 있습니다.

나는 다음과 같은 경우에 NumberFormatException이있어 :

1000000 
enter twice 

없는 시스템 becuase "입니다 정수 형식을 변환하는 비 숫자 형식을 얻을".

나는 당신이 Integer.parseInt에 전달 된 숫자가 아닌 문자가 NumberFormatException가 발생합니다이 버퍼 오버 플로우 아니라 가정 버그 :

0

을 찾아 내 분석의 도움을 바랍니다. 공백 문자와 줄 바꿈과 같은 인쇄 할 수없는 문자 및 소수점을 포함합니다 (부동 소수점 숫자는 정수가 아니므로).

read.readLine()을 호출 할 때 .trim()을 사용하고 Integer.parseInt()으로 전달하기 전에 null 또는 빈 문자열을 확인하여 입력의 유효성을 검사 해 볼 수 있습니다. 예 :

 String input = read.readLine(); 

    if (input != null) 
     input = input.trim(); 
    if (input.equals("")) 
     throw new IllegalArgumentException("Input must be a number"); 

    int no=Integer.parseInt(input); 

두 번째 readLine() 호출의 경우에도 첫 번째 행에 대한 입력의 유효성을 검사하기로 결정했습니다. 다행히 문제의 원인을 정확히 좁힐 수 있기를 바랍니다.