<자바코드>
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 문도 자바와 코틀린의 문법이 동일하다.
<자바코드>
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이다.
<자바코드>
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 확장 함수를 사용해야 한다.>