boo106   6년 전

런타임 오류가 왜 뜨는지 모르겠는데 이유가 scan1.close()를 안해줘서 그런것 같아서 찝찝하네용...

그리고 제가 c랑c++을 주로 사용했어서 Scanner클래스를 사용할 시 꼭 close를 해주고 싶은데 처음에 테스트 갯수를 입력받는 nextInt와 스트링을 입력받으려고 사용한 nextLine을 같이 사용하면 nextLine이 제대로 작동하지 않고 씹히더라고요... 그래서 int를 입력받는 scan1과 스트링을 입력받는 scan을 따로 만들어 줘서 사용을 했는데 scan1.close()를 하면 static으로 선언된 System.in까지 닫혀버려서 scan이 제대로 작동하지 않는다 하더라고요... 이게 맞는 지식인지는 모르겠어요.

암튼 그래서 구글링 해보니 Console클래스를 이용해보라 해서 또 이용해보니 이번에는 java.lang.NullPointerException 라는 에러가 자꾸 뜨더라고요... (이게 콘솔창에서 실행을 안하고 이클립스에서 실행을 해서 이런 오류가 뜬다는데 맞나요..?)

Scanner클래스를 이용시 매번 close를 해주고 싶은데 이것에 대한 해결책도 들어보고 싶어요.

bupjae   6년 전

System.in 과 연결된 Scanner 객체는 일단 한 번 만들면 프로그램 끝날 때 까지 그 하나만 이용해야 합니다.

한 번 닫아버리면 System.in 에서 미리 버퍼에 읽어놓았던 데이터를 모두 잃게 됩니다.


Console 은 채점 환경에서는 사용할 수 없습니다.

isku   6년 전

  1. Scanner를 2개 사용하면 안됩니다.
  2. nextInt(), next()는 줄바꿈 '\n'을 읽지 않고, nextLine()은 '\n'까지 읽습니다.
    따라서 nextInt() 이후에 nextLine()을 하면 nextLine()은 '\n'만 읽을 것입니다.
  3. Scanner는 close() 하지 않아도, 프로그램 종료시 자동으로 close()를 합니다. 하지만 close()를 명시해주는 것은 좋은 습관입니다.

boo106   6년 전

댓글 달아주신분들 다 감사한데 Scanner를 1개만 사용하면 nextInt를 하고 nextLIne을 사용하면 nextLine이 작동을 하지 않고 아무것도 안읽고 리턴null을 해버리더라구요ㅠㅠ 이건 어떻게 해결하죠??ㅠㅠ

이렇게 수정해보앗는데요....

17fa10c0-a5be-4990-b5ac-3f09d0e0993e

isku   6년 전

이 문제의 입력 형식으로는 nextLine() 대신에 next()를 사용해도 됩니다.


nextInt()는 위에서 설명했던대로, 한 문장의 끝인 '\n' 줄바꿈을 읽지 않습니다.

위 코드에서 testCase를 읽을 때 문장의 끝인 '\n'를 읽지 않아서, 

그다음 for문에서 nextLine()에서 testCase의 마지막에 남아있던 '\n'를 처리하느라 nullpointer exception이 발생한 것으로 보이네요.

nextInt()나 next() 이후에 다음 라인을 읽으려면, '\n'를 제거하기 위해 의미 없는 nextLine()을 한번 호출 후에 다음 nextLine()을 수행하면 되겠습니다.

ps. 위에서 scanner가 프로그램 종료시 자동으로 close() 된다고 하였는데, 정확하지는 않습니다.. i/o 관련해서는 항상 close() 해주는 습관을 들이는게 좋습니다~

boo106   6년 전

해결 되엇네요 넘나넘나 감사합니당 ㅠㅠㅠㅠㅠㅠㅠ

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