[Kotlin] 예외처리의 종류

neoneoneo·2024년 3월 14일
0

kotlin

목록 보기
34/49

지난 포스팅에서 kotlin에서 예외처리 사용법에 대해 다뤘었다.

최근 콘솔창에서 작동하는 계산기와 키오스크를 구현하면서, 예외처리 작업을 하면서 자주 사용하게 되는 예외처리들이 있는 것 같아 이번 포스팅에서는 예외처리 종류를 알아보고 정리하고자 한다.


NullPointerException

발생 : null 값을 허용하지 않는 참조형 변수가 null 값을 갖고 있을 때

var str: String? = null // null 값을 갖는 문자열 변수
try {
    val length = str!!.length // null 값을 갖는 변수에 접근
    println("문자열 길이: $length")
} catch (e: NullPointerException) {
    println("문자열이 null입니다.")
}

ArrayIndexOutOfBoundsException

발생 : 배열의 범위를 벗어난 인덱스에 접근하려고 할 때

try {
    val array = arrayOf(1, 2, 3)
    println("배열 요소: ${array[5]}") // 배열의 범위를 벗어난 인덱스에 접근
} catch (e: ArrayIndexOutOfBoundsException) {
    println("배열의 범위를 벗어났습니다.")
}

IndexOutOfBoundsException

발생 : 컬렉션 등의 인덱스 범위를 벗어난 인덱스에 접근하려고 할 때

try {
    val list = listOf(1, 2, 3)
    println("리스트 요소: ${list[5]}") // 리스트의 범위를 벗어난 인덱스에 접근
} catch (e: IndexOutOfBoundsException) {
    println("리스트의 범위를 벗어났습니다.")
}

FileNotFoundException

발생 : 파일을 찾을 수 없는 경우

import java.io.File
try {
    val file = File("non_existing_file.txt")
    val text = file.readText() // 파일이 존재하지 않는 경우
    println("파일 내용: $text")
} catch (e: FileNotFoundException) {
    println("파일을 찾을 수 없습니다.")
}

IOException

발생 : 입출력 작업 중에 예외 상황 시 일반적으로 발생하는 입출력 예외

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("파일 읽기에 실패했습니다.")
}

IllegalArgumentException

발생 : 메서드에 부적절한 인수가 전달되었을 때

fun greet(name: String) {
    if (name.isBlank()) {
        throw IllegalArgumentException("이름이 비어있습니다.") // 부적절한 인수
    }
    println("안녕하세요, $name님!")
}
try {
    greet("") // 부적절한 인수 전달
} catch (e: IllegalArgumentException) {
    println("인수가 부적절합니다: ${e.message}")
}

NumberFormatException

발생 : 숫자 형식으로 변환할 수 없는 문자열을 숫자로 변환 시도 시

try {
    val number = "abc".toInt() // 숫자로 변환할 수 없는 문자열
    println("숫자: $number")
} catch (e: NumberFormatException) {
    println("숫자로 변환할 수 없는 문자열입니다.")
}
  • 특히 숫자로 입력 값을 받아와야 할 때 사용한다.

ArithmeticException

발생 : 0으로 나누는 경우 또는 부적절한 산술 연산 수행 시

try {
    val result = 10 / 0 // 0으로 나누는 연산
    println("결과: $result")
} catch (e: ArithmeticException) {
    println("0으로 나눌 수 없습니다.")
}

예외처리와 함께 알아두면 좋은 문법

do-while

계산기를 만드는 중 숫자를 받아와야 하는데, 문자가 입력되어 예외처리 한 다음에 다시 숫자를 받아오는 시도를 하려면 어떻게 하지? 라는 의문으로부터 찾아보니, 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]

0개의 댓글