Java 9에서 도입된 JShell은 Java 언어의 다양한 기능과 방대한 표준 라이브러리를 빠르게 탐색하고, 실험하고, 학습할 수 있도록 도와주는 빠르고 친화적인 대화형 환경입니다.
JShell의 가장 큰 장점 중 하나는 예외 처리 코드를 직접 작성할 필요가 없다는 점입니다. JShell은 발생하는 모든 예외를 자동으로 포착(catch)하여 관련 정보를 화면에 출력한 뒤, 곧바로 다음 프롬프트를 표시하기 때문에 세션을 계속 이어갈 수 있습니다.
이 기능은 unchecked 예외에도 동일하게 적용됩니다. 즉, JShell은 checked 예외와 unchecked 예외를 모두 자동으로 처리하므로, checked 예외를 던지는 메서드도 try-catch 블록 없이 부담 없이 실험해 볼 수 있습니다.
예제 1: ArrayIndexOutOfBoundsException
아래 예제에서는 배열에 존재하지 않는 인덱스 values[4]에 접근했기 때문에 ArrayIndexOutOfBoundsException이 발생합니다.
jshell> int[] values = {10, 20, 30}
values ==> int[3] { 10, 20, 30 }
jshell> values[4]
| java.lang.ArrayIndexOutOfBoundsException thrown: 4
| at (#7:1)예제 2: FileNotFoundException
아래 예제에서는 지정한 디렉터리에서 파일을 찾을 수 없기 때문에 FileNotFoundException(checked 예외)이 발생합니다. 일반적인 Java 프로그램이라면 이 예외를 반드시 처리해야 컴파일 오류가 나지 않지만, JShell에서는 자동으로 처리됩니다.
jshell> FileInputStream fis = new FileInputStream("data.txt")
| java.io.FileNotFoundException thrown: data.txt (The system cannot find the file specified)
| at FileInputStream.open0 (Native Method)
| at FileInputStream.open (FileInputStream.java:196)
| at FileInputStream.<init> (FileInputStream.java:139)
| at FileInputStream.<init> (FileInputStream.java:94)
| at (#5:1)예제 3: ArithmeticException
아래 예제에서는 값 "1/0"이 수학적으로 정의되지 않기(undefined) 때문에 unchecked 예외인 ArithmeticException이 발생합니다.
jshell> 1/0 | java.lang.ArithmeticException thrown: / by zero | at (#4:1)
이처럼 JShell은 예외가 발생해도 프로그램이 종료되지 않고 스택 트레이스 정보를 보여준 뒤 바로 다음 입력을 받을 수 있으므로, 예외 상황을 빠르게 확인하고 학습하기에 매우 유용한 도구입니다.