7장 코틀린에서 예외를 다루는 방법

2024. 1. 14. 00:55kotlin/문법

해당 내용은 인프런 최태현님의 자바 개발자를 위한 코틀린 입문 강의에서 발췌한 내용입니다.

목차

  1. try catch finally 구문
  2. Checked Exception과 Unchecked Exception
  3. try with resources

try catch finally

주어진 문자열을 정수로 변경하는 예제

JAVA

private int parseIntOrThrow(@NotNull String str) {
    try {
        return Integer.parseInt(str);
    } catch (NumberFormatException e) {
        throw new IllegalArgumnetException(String.format("주어진 %s는 숫자가 아닙니다.", str));
    }
}

Kotlin

fun parseIntOrThrow(str: String): Int {
    try {
        return str.toInt()
    } catch (e: NumberFormatException) {
        throw IllegalArgumnetException("주어진 ${str}는 숫자가 아닙니다.");
    }
}
  • 기본타입간의 형변환은 toType()을 사용!

주어진 문자열을 정수로 변경하는 예제 실패하면 null을 반환!!

JAVA

public Integer pareIntOrNull(String str) {
    try {
        return Integer.parseInt(str);
    } catch (NumberFormatException e) {
        return null;
    }
}

Kotlin

fun parseIntOrNull(str: String): Int? {
    return try {
        str.toInt()
    } catch (e: NumberFormatException) {
        null
    }
}
  • try catch도 코틀린의 if-else 혹은 if- else if -else 처럼 하나의 Expression으로 간주된다.

Checked Exception과 Unchecked Exception

프로젝트 내 파일의 내용물을 읽어오는 예제

JAVA

public void readFile() throws IOException {
    File currentFile = new File(".")
    File file = new File(currentFile.getAbsolutePath() + "/a.txt")
    BufferedReader reader = new BufferedReader(new FileReader(file))
    System.out.println(reader.readLine())
    reader.close()
}

Kotlin

fun readFile() {
    val currentFile = File(".")
    val file = File(currentFile.absolutePath + "/a.txt")
    val reader = BufferedReader(FileReader(file))
    println(reader.readLine())
    reader.close()
}
  • throws IOException이 없다!
  • Kotlin에서는 Checked Exception과 Unchecked Exception을 구분하지 않는다.
    모두 Unchecked Exception이다.

try with resources

JAVA

public void readFile(String path) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(path))) { System.out.println(reader.readeLine()); }
}

Kotlin

fun readFile(path: String) {
    BufferedReader(FileReader(path)).use {reader ->
        println(reader.readLine())
    }
}
  • java에 있는 try with resources라는 구문자체가 사라지고 use라는 inline 확장함수를 사용한다.

정리하기

- try catch finally 구문은 문법적으로 완전히 동일하다.
    - Kotlin에서는 try catch가 expression이다.
- Kotlin에서 모든 예외는 Unchecked Exception이다.
- Kotlin에서는 try with resources 구문이 없다. 대신 코틀린의 언어적 특징을 활용해close를 호출해준다.