문제상황
Scanner로 사용자로부터 문자열을 입력받아 점(.)
을 기준으로 split() 하려고 실행하니 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
런타임에러가 발생했다.
1 2 3 4 5 6 7 8 9
| public static void main(String[] args) { Scanner sc = new Scanner(System.in); String f = sc.next(); String[] ff = f.split("."); String int1 = ff[0]; String int2 = ff[1]; System.out.println(int1); System.out.println(int2); }
|
1 2
| 12.123 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
|
해결
split(".")
에서 split("\\.")
으로 변경해준다.
1 2 3 4 5 6 7 8 9
| public static void main(String[] args) { Scanner sc = new Scanner(System.in); String f = sc.next(); String[] ff = f.split("\\."); String int1 = ff[0]; String int2 = ff[1]; System.out.println(int1); System.out.println(int2); }
|
원인
- 정규표현식에서
점(.)
은 임의의 한 문자(종류를 가리지않지만 \는 넣을 수 없음)를 의미한다.
split()
과 replace()
를 사용할 때, 점(.)
이 정규식으로 적용되어 모든 문자를 “”으로 만들어 버린다.
점(.)
을 점(.)
그대로 인식시키기 위해서는 \.
로 해줘야 한다.
- 하지만
\
또한 예약어이기 때문에 \\
로 표시해줘야 한다.
- 따라서
\\.
을 입력해줘야 원하는 .
을 출력할 수 있다.
참고