[코틀린] 코틀린에서 예외를 다루는

J·2023년 3월 20일
1

안드로이드

목록 보기
18/29

1. try catch finally 구문

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

<자바코드>

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

<코틀린코드>

fun parseIntOrThrow(str: String): Int {
  try {
    return str.toInt()
  } catch (e: NumberFormatException) {
    throw IllegalArgumentException("주어진 ${str}은 숫자가 아닙니다.")
  }
}

자바와 코틀린의 예외 처리의 차이점

a. 기본타입간의 형변환은 toType()을 사용.
b. 타입이 뒤에 위치함.
c. new를 사용하지 않음.
d. 포맷팅이 간결함.
e. 그 외의 try~catch 구문은 같음.
b. 주어진 문자열을 정수로 변경하는 예제, 실패하면 null 반환

<자바코드>

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

<코틀린코드>

fun parseIntOrThrowV2(str: String): Int? {
  return try {
    str.toInt()
  } catch (e: NumberFormatException) {
    null
  }
}

=> 코틀린에서는 try~catch 문도 하나의 Expression으로 간주된다. 그래서 try~catch문에서 나온 최종 결과물은 한번만 return 해도 코드가 동작한다.
=> try ~ catch ~ finally 문도 자바와 코틀린의 문법이 동일하다.

2. Checked Exception과 Unchecked Exception

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

<자바코드>

public void readFile() throws IOException { //close, read line, FileReader 등의 구문을 생성할 경우에는 반드시 체크 예외가 날 수 있다는 의미로 [throws IOException] 을 표시해줘야 한다.
  File currentFile = new File(".");
  File file = new File(currentFile.getAbsolutePath() + "/a.txt");
  BufferedReader reader = new BufferdReader(new FileReader(file));
  System.out.println(reader.readLine());
  reader.close();
}

<코틀린코드>

fun readFile() {
  val currentFile = File(".")
  val file = File(currentFile.absolutePath + "/a.txt")
  val reader = BufferedReader(FileReader(file))
  println(reader.readLine())
  reader.close()
}

<자바코드와 코틀린코드의 차이점>
a. 자바에서는 close(), readLine(), FileReader() 등의 구문들 생성할 경우에는 반드시 체크 예외가 날 수 있다는 의미로 throws IOException을 표시해줘야 한다.
b. 하지만, 코틀린에서는 Checked Exception 과 Unchecked Exception을 구분하지 않는다. 모두 Unchecked Exception이다.

3. try with resources

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

<자바코드>

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

<코틀린 코드(코틀린에는 try with resouces 구문이 없다.)>

fun readFile(path: String) {
  BufferedReader(FileReader(path)).use { reader ->
    println(reader.readeLine())
  }
}

<코틀린에서는 try with resouces 구문이 없어지고, 대신 use라는 inline 확장 함수를 사용해야 한다.>

0개의 댓글