Java: 파일에서 정수를 배열로 읽기

File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);

int [] tall = new int [100];

String s =in.readLine();

while(s!=null)
{
    int i = 0;
    tall[i] = Integer.parseInt(s); //this is line 19
    System.out.println(tall[i]);
    s = in.readLine();
}

in.close();

Tall.txt 파일을 사용하여 그 파일에 포함된 정수를 이라는 배열에 쓰려고 합니다. 이 작업을 어느 정도 수행하지만 실행하면 다음과 같은 예외가 발생합니다 (:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at BinarySok.main(BinarySok.java:19)

정확히 왜 이런 현상이 발생하며 어떻게 제거할 수 있나요? 제가 보기에는 파일을 문자열로 읽은 다음 정수로 변환하는데, 이는 불법이 아닙니다.

파일에 빈 줄이 있어야 합니다.

parseInt 호출을 &시도 블록으로 감싸는 것이 좋습니다:

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

또는 구문 분석 전에 빈 문자열이 있는지 확인합니다:

if (s.length() == 0) 
  continue;

루프 내에서 인덱스 변수 i를 초기화하면 항상 0이 된다는 점에 유의하세요. 선언을 while 루프 앞에 옮겨야 합니다. (또는 for 루프의 일부로 만들 수도 있습니다.)

해설 (1)

Java가 빈 문자열을 숫자로 변환하려고 하는 것 같습니다. 일련의 숫자 끝에 빈 줄이 있나요?

다음과 같이 코드를 수정할 수 있습니다.

String s = in.readLine();
int i = 0;

while (s != null) {
    // Skip empty lines.
    s = s.trim();
    if (s.length() == 0) {
        continue;
    }

    tall[i] = Integer.parseInt(s); // This is line 19.
    System.out.println(tall[i]);
    s = in.readLine();
    i++;
}

in.close();
해설 (0)

서로 다른 줄 끝이 혼동될 수 있습니다. Windows 파일은 각 줄을 캐리지 리턴과 줄 바꿈으로 끝냅니다. Unix의 일부 프로그램은 캐리지 리턴을 줄 끝으로 인식하고 줄 바꿈을 또 다른 줄 끝으로 인식하기 때문에 해당 파일을 각 줄 사이에 여분의 빈 줄이 있는 것처럼 읽습니다.

해설 (1)