ehfkswl   5년 전

제가 scanner을 이용하여 한개는 모든 변수를 string으로 받고 필요한 것들을 int로 바꿨더니 런타임 에러가 났고

다른 하나는 integer는 integer 그대로, string은 string그대로 변수를 받아 코드를 실행하여 통과하였습니다

두 코드가 어떤차이가 있을까요?

그리고 nextLine의 경우에는 enter(줄바꿈)을 그대로 input으로 받나요?

그러니까 nextint를 먼저 실행하여 integer를 input으로 받고나서 nextLine으로 string을 input으로 받고 싶은데 nextInt에서 숫자와 함께 enter키를 입력을 하면 

string을 받기전에 null 값이 들어가는것 같는데 맞는건가요? 

답변해주시면 감사하겠습니다 ~~

djm03178   5년 전

위의 코드는 nextLine을 쓰고 있습니다. 메서드 이름 그대로, 한 줄을 통째로 입력받는 메서드입니다. 그러니 예제처럼

3 ABC

라는 입력이 있었다면, nextLine은 "3 ABC"를 그대로 반환합니다. 이걸 parseInt를 시도하면 정수가 아닌 문자열이 끼어있으므로 예외를 던지게 됩니다.

nextLine은 개행 문자를 기준으로 줄을 구분하므로 nextInt를 호출했을 때 엔터를 쳤다면 그 때의 개행 문자가 그대로 남아있고, 다음의 nextLine은 그 엔터 키를 읽고 거기가 줄의 끝이라고 판단해서 빈 문자열을 리턴합니다. null과 빈 문자열은 다르고, 이 경우는 null이 아닌 빈 문자열입니다.

ehfkswl   5년 전

먼저 답변 감사드립니다

조금 질문을 바꿔보면 제가 처음에 짯던 코드는 먼저 nextInt로 반복되는 횟수를 입력받은 다음 nextLine으로 문자열을 입력받으려고 하였습니다

그러니까 인풋으로 제 의도는

3

ABC

와 같이 줄바꿈으로 3은 integer로 ABC는 string으로 받고 싶었습니다

그러나 실제 실행에서는 ABC를 입력하는 것 대신 3 다음으로 줄바꿈(Enter)을 입력하면 string값으로 null이 아닌 말씀하신 빈 문자열("")을 input으로 받았습니다

이부분에 대해서 설명해 주실 수 있을까요?

그리고 혹시 위에 코드가 런타임 에러가 나는 이유는 무엇일까요? 알고리즘 자체는 비슷해 보이는데 ㅜㅜ

djm03178   5년 전

다시 설명해 드리겠습니다.

3

ABC

라고 입력했다면, 3 뒤에는 개행 문자가 하나 들어있습니다.

nextInt는 여기서 오로지 3만 읽습니다. 그 뒤에 있는 개행 문자는 읽지 않고 그대로 남겨둡니다.

그 다음 nextLine이 개행 문자가 나올 때까지 읽기를 시도합니다. 그런데 아까 nextInt가 남겨둔 개행 문자가 눈앞에 곧바로 나타났습니다.

그럼 여기는 nextLine이 읽어야 할 문자열의 끝이네요?

그런데 이전까지 nextLine이 읽은 문자가 아무것도 없으니, nextLine은 빈 문자열을 리턴하게 되는 것입니다. nextLine은 null을 리턴하지 않습니다.

위의 코드가 런타임 에러가 나는 이유는 아까 설명드린 그대로입니다. 입력이

3

ABC

가 아니고,

3 ABC

이기 때문에, nextLine을 호출하면 "3 ABC"가 반환되는데 이를 parseInt로 파싱을 시도하기 때문에 exception이 발생하므로 런타임 에러가 되는 것입니다. 입력의 형식을 임의로 바꾸고선 잘 돌아간다고 생각하면 안 됩니다. 주어진 그대로, 있는 그대로 입력하고 돌려봐야 합니다.

djm03178   5년 전

제가 잠시 착각했는데, 입력의 끝에 도달했을 때 null을 리턴하는 건 BufferedReader.readLine이고, Scanner.nextLine은 이 경우 NoSuchElementException 을 던집니다.

ehfkswl   5년 전

답변해주셔서 감사합니다 이제 nextLine 개념에 대해 잘 이해가 되었습니다!

댓글을 작성하려면 로그인해야 합니다.