コトリンの異常を処理する

2064 ワード

コトリンの異常処理はJavaや他の言語の異常処理に似ている.
関数は正常に終了しますが、エラーが発生した場合は例外を放出できます.(throw)
関数呼び出し端子が処理(catch)で発生した異常を処理していない場合、関数呼び出しスタックを遡り、処理異常の部分が現れるまで再び異常を放出します.(rethrow)
if (percentage !in 0..100) {
	throw IllegalArgumentException(
    	"A Percentage value must be between 0 and 100: $percentage")
}
他のクラスと同様に、例外インスタンスを作成する場合もnewを追加する必要はありません.(たとえば、Javaでnew Person()というオブジェクトを作成する必要はありませんが、クラスオブジェクトを宣言するように、コトリンでPerson()のみを宣言します)
Javaとは異なり、コトリンのthrowは式であり、他の式に含めることができる.
val percentage = 
	if (number in 0..100)
    	number
   	else
    	throw IllegalArgumentException( // throw는 식이다.
        "A percentage value must be between 0 and 100: $number")
try, catch, finally
Javaと同様に、例外を処理する場合はtryとcatchとfinallyセクションを同時に使用できます.
fun readNumber(reader: BufferedReader) : Int? { // 함수가 던질 수 있는 예외를 명시할 필요가 없다. 
	try{
    	val line = reader.readLine()
        return Integer.parseInt(line)
    }
    catch (e: NumberFormatException) { // 예외 타입을 :의 오른쪽에 쓴다 (자바와 문법적 차이)
    	return null
    }
    finally { // finally는 자바와 똑같이 작동한다. (오류가 발생하든 안 발생하든 실행하라는 뜻)
    	reader.close()
    }
}

-> val reader = BufferedReader(StringReader("239"))
-> println(readNumber(reader))
239
Javaコードとの最大の違いは、throwsセクションがコードに含まれていないことです.
つまり,おそらくJavaはチェック例外を明確に扱うべきである.
コトリンはやらなくてもいいです.
tryで使用
tryを使用して上記の例finallyセクションを削除し、コードを追加してファイルの読み取り数を出力します.
fun readNumber(reader: BufferedReader) {
	val number = try {
    	Integer.parseInt(reader.readLine()) // 이 식의 값이 try 식의 값이 된다.
    } catch (e: NumberFormatException) {
    	return
    }
    
    println(number)
}

-> val reader = BufferedReader(StringReader("not a number"))
-> readNumber(reader) // 아무것도 출력되지 않는다.
上記の例ではcatchブロックでreturn文が使用されていますが、値は返されません.したがって、コンテンツは出力されません.
もし、もし
} catch (e: NumberFormatException) {
	null
}
もしあげるなら.
例外が発生した場合はNull値を使用します.