본문 바로가기
기타

[Why?] BufferdReader 반복 생성 시 에러

by foreverever 2019. 8. 30.
반응형

1. BufferdReader를 반복문 안에서 매번 생성해서 입력받게끔 구현.

2. 입력은 한꺼번에 받게 끔

3. NumberFormatException 발생 (21번 째 줄)

4. why???

5. but... 직접 한줄 한줄 씩 입력할 경우에는 에러 발생 X

 

 

1. 반복문 위에서 BufferdReader 객체 하나만 생성

2. 입력은 한꺼번에 받게 끔

3. 정상 작동

4. 얘는 왜?

 

<원인>

BufferdReader의 경우, 입력이 있을 때 마다 버퍼로 해당 문자를 전송한다.

readLine()을 통해 문자를 읽어올 때, 버퍼에 있는 개행문자를 기준으로 읽어온다. (즉, 한줄 씩 읽어옴)

만약 반복문 마다 BufferdReader 객체를 새로 생성하면, 기존의 버퍼에 있는 값이 없어진다.

즉, 입력값을 한번에 붙여넣을 경우 (반복문 마다 입력받아 버퍼에 넣지 않고, 한번에 입력받아 하나의 버퍼에 모두 담을 경우) 2회차 반복문에서 BufferdReader 객체를 새로 생성하면서 버퍼가 초기화 되므로, readLine()해야 할 문자가 버퍼에 없기 때문에, 입력받도록 대기탐.

이후 엔터를 누를경우, 엔터값만 버퍼에 들어가고 해당 엔터값을 읽어오면서 Integer.parseInt(엔터값)에서 엔터값을 pase메서드 인자로 잘못 전달하므로, NumberFormatException 이 발생하는 것이다.

 

그럼 한 줄 씩 읽을 때는 왜 정상동작하느냐??

말 그대로 readLine()이 호출될 때 마다 입력문자와 엔터값을 한번 씩 넣어 바로 버퍼값을 읽어오므로, BufferdReader를 새로 만들더라도 손실되는 데이터가 없다.

 

그러면 한번에 입력을 받고 싶을 때는 어떻게 하냐??

BufferdReader 객체생성을 한 번만 하여, 해당 버퍼에 모든 입력값을 복붙(개행문자도 포함)하면 된다.

그럼 readLine()을 통해 버퍼에 있는 값을 잘 꺼내오기 때문이다.

 

BufferdReader를 깊이있게 공부를 안하다 보니, 입출력 과정에서 에러가 발생하여 삽질을 많이했다.

단순히 갖다 쓰는 것이 아닌, 내부 동작 원리를 이해해서 사용해야 에러 발생 시 빠르고 유연하게 대처할 수 있음을 느꼈다.

깊이 있는 공부가 필요하다.

반응형