Java

Scanner scanInt(int radix) 사용 시, InputMismatchException이 발생하는 이유

금붕어빵 2020. 1. 2. 22:17

Scanner 클래스에서 제공하는 메서드 중에 scanInt(int radix)라는 메소드가 있다. 이 메소드는 몇 진수의 값을 키보드로 입력할 것인지를 매개변수로 제공해주면 키보드로 입력한 값을 10진수로 변환해 반환해준다.

 

본인은 알고리즘 문제를 풀다가 int형이 가질 수 있는 최소값과 최대값을 구해야하는 상황에서 scanInt(int radix)를 사용하게 되었는데 사용도중 아래와 같은 오류가 발생했다.

에러의 원인을 파악해보면.. 음수 값의 오버플로우 현상 때문에 형변환이 안되서 발생한 것으로 보이는데, 이게 말이 안되는 것이 16진수 값 0x80000000은 int형이 가질 수 있는 가장 작은 값인 -2147483648(10)이라서 오버플로우가 발생할리가 없었다.

 

원인을 알아내기 위해서 이것저것 테스트를 해보다가 scanInt(int radix)를 메서드를 안쓰고 변수에 직접 16진수 값을 초기화 시켜 10진수 값으로 출력을 해보았는데, 이번에는 정상적으로 결과가 나타났다.

그럼 scanInt(int radix)의 내부 로직에 뭔가 문제가 있다는 것인데.. 원인이 무엇이었을까? 원인은 바로 메소드에 전달하는 인자에 있었다. 나는 당연히 음수도 양수와 같이 10진수로 변환해줄거라 생각해서 16진수 값 80000000를 인자값으로 보냈었는데, 메서드는 이 값이 양수인지 음수인지를 최상위 비트를 통해 분류를 하지 못하는 것 같았다. 때문에 사용자는 메소드를 사용할때 전달할 인자 값이 음수라면 인자값에 -를 붙여주어야만 한다. ex) -80000000

 

이렇게 하면 에러없이 메소드가 결과를 도출해서 정상적으로 결과 값을 출력하는 것을 확인할 수가 있다.