지난 포스팅에서 kotlin에서 예외처리 사용법에 대해 다뤘었다.
최근 콘솔창에서 작동하는 계산기와 키오스크를 구현하면서, 예외처리 작업을 하면서 자주 사용하게 되는 예외처리들이 있는 것 같아 이번 포스팅에서는 예외처리 종류를 알아보고 정리하고자 한다.
발생 : null 값을 허용하지 않는 참조형 변수가 null 값을 갖고 있을 때
var str: String? = null // null 값을 갖는 문자열 변수 try { val length = str!!.length // null 값을 갖는 변수에 접근 println("문자열 길이: $length") } catch (e: NullPointerException) { println("문자열이 null입니다.") }
발생 : 배열의 범위를 벗어난 인덱스에 접근하려고 할 때
try { val array = arrayOf(1, 2, 3) println("배열 요소: ${array[5]}") // 배열의 범위를 벗어난 인덱스에 접근 } catch (e: ArrayIndexOutOfBoundsException) { println("배열의 범위를 벗어났습니다.") }
발생 : 컬렉션 등의 인덱스 범위를 벗어난 인덱스에 접근하려고 할 때
try { val list = listOf(1, 2, 3) println("리스트 요소: ${list[5]}") // 리스트의 범위를 벗어난 인덱스에 접근 } catch (e: IndexOutOfBoundsException) { println("리스트의 범위를 벗어났습니다.") }
발생 : 파일을 찾을 수 없는 경우
import java.io.File try { val file = File("non_existing_file.txt") val text = file.readText() // 파일이 존재하지 않는 경우 println("파일 내용: $text") } catch (e: FileNotFoundException) { println("파일을 찾을 수 없습니다.") }
발생 : 입출력 작업 중에 예외 상황 시 일반적으로 발생하는 입출력 예외
import java.io.BufferedReader import java.io.FileReader import java.io.IOException try { val reader = BufferedReader(FileReader("file.txt")) val line = reader.readLine() // 파일 읽기 시 예외 발생 println("읽은 줄: $line") } catch (e: IOException) { println("파일 읽기에 실패했습니다.") }
발생 : 메서드에 부적절한 인수가 전달되었을 때
fun greet(name: String) { if (name.isBlank()) { throw IllegalArgumentException("이름이 비어있습니다.") // 부적절한 인수 } println("안녕하세요, $name님!") } try { greet("") // 부적절한 인수 전달 } catch (e: IllegalArgumentException) { println("인수가 부적절합니다: ${e.message}") }
발생 : 숫자 형식으로 변환할 수 없는 문자열을 숫자로 변환 시도 시
try { val number = "abc".toInt() // 숫자로 변환할 수 없는 문자열 println("숫자: $number") } catch (e: NumberFormatException) { println("숫자로 변환할 수 없는 문자열입니다.") }
- 특히 숫자로 입력 값을 받아와야 할 때 사용한다.
발생 : 0으로 나누는 경우 또는 부적절한 산술 연산 수행 시
try { val result = 10 / 0 // 0으로 나누는 연산 println("결과: $result") } catch (e: ArithmeticException) { println("0으로 나눌 수 없습니다.") }
계산기를 만드는 중 숫자를 받아와야 하는데, 문자가 입력되어 예외처리 한 다음에 다시 숫자를 받아오는 시도를 하려면 어떻게 하지?
라는 의문으로부터 찾아보니, do-while 안에 예외처리 문을 넣으면 try-catch가 있는 해당 함수를 종료시키지 않으면서 계속해서 값을 받아오게끔 할 수 있다.
println("더하기를 선택하셨습니다.") do { try { println("[좌] + [ ] 입력해주세요.") left = readLine()!!.toDouble() } catch (e: java.lang.NumberFormatException) { println("숫자를 입력해주세요.") } } while (left.isNaN())
- 만약 2개의 항을 입력받아 더하는 연산을 해주고 결과 값을 출력하고자 하면, 이런식으로 do-while 안에 입력 처리에 대한 코드를 넣어 숫자가 들어올 때까지 반복할 수 있다.
[TIL-240314]