트러블슈팅
부트캠프 계산기 과제 작업 중
사용자한테서 계산할 숫자와 연산자를 입력받기 위해 Scanner 객체를 사용 중이다.
scanner.nextLine()과 System.out.print()으로 입출력을 꾸리고 있던 중
다음 과 같은 문제가 발생했다.

// 종료 여부 질문 '네' 또는 '아니요'가 아닐 시 다시 질문
// ...'네' 입력시 처음부터 반복
// ...'아니오' 입력시 종료
while (true) {
System.out.println("다시 계산하시겠습니까? (네/아니요)");
String exitQuestion = sc.nextLine();
System.out.println(exitQuestion);
if (exitQuestion.equals("아니요")) {
exit = true;
break;
}
else if (exitQuestion.equals("네")) break;
}
}
분명 의미상의 문제는 없는데 다시 계산하겠냐는 질문에는 엔터를 입력하지 않았는데도 눌린 판정이 나서 넘어감.
처음엔 내 키보드가 두 번 누르는 건가 해서 여러 번 시도함...
아무리봐도 scanner 메서드 조작에서의 문제 같아서 nextLong(), next(), nextLine() 적절한지 체크하다가

// 연산기호(+ - * /) 입력받는 코드
// 사칙연산이 아닌 값이 들어올 때 예외처리 필요 (언제? 어디서?)
// charAt(0)으로 첫 번째 문자만 저장됨
System.out.print("사칙연산 기호를 입력하세요: ");
operator = sc.next().charAt(0);
위 코드의 스캐너를 next()에서 nextLine()으로 고쳤더니 런타임에러를 띄운다

에러 내용이 CharAt으로 문자열의 0번 인덱스를 접근했다가 인덱스가 존재하지 않아서 예외가 발생함
이것을 보고 이전 next류의 메서드들에 의해 입력된 값들이 뒤에서 다시 nextLine으로 입력받을 때 영향을 미치고 있다고 예상함
이거 아무리 생각해도 System.in 으로 입력된 버퍼에서 나타나는 문제같음... 보통 입출력은 버퍼를 이용하니깐..
scanner 메서드: next(), nextInt(), nextLine() 차이
next(), nextLine()은 String 반환, nextInt()는 int 반환이다.
그런데 next(), nextInt()는
System.in으로 버퍼에서 화이트스페이스들.. *↵(LF\n,CR\r)/공백(SPC) 표현이 너무 많다
이전 까지 출력하고 은 그대로 둔다.
nextLine()은 같은 방식으로 엔터/공백 포함해서 전부 가져온다.
그래서 ...
내가 쓴 코드는 next() 작업 후 버퍼에는 \r\n이 남아 있고, 이 상태에서 nextLine()으로 \r\n을 가져와 버린 것!
해결하기
내가 고려해 볼 수 있는 건 세 가지.