【KotlinとJava】NULLチェック
KotlinとJava
Kotlinは基本的にNULLをできるだけ排するよう考えられている。NULLはつまり、割り当てる値がないということなのだが、プログラムの工夫や仕様の制限などである程度は回避することができる。しかし、どうしてもNULLが発生してしまう場合もある。
KotlinはそうしたNULLが発生する状況についてどのような答えを出したのだろうか?
Null-checks.kt
fun parseInt(str: String): Int? {
try {
return str.toInt()
} catch (e: NumberFormatException) {
println("One of the arguments isn't Int")
}
return null
}
fun main(args: Array<String>) {
if (args.size < 2) {
println("No number supplied")
} else {
val x = parseInt(args[0])
val y = parseInt(args[1])
if (x != null && y != null) {
print(x * y)
} else {
println("One of the arguments is null")
}
}
}
先ほどの答えだが、Kotlinは「NULLかもしれない」という場所にマークをつけることにしたのだ。fun parseInt(str: String): Int?
の戻り値のInt?
にクエスチョンマークがついているのに気が付いただろうか?これはこのparseInt
という関数がNULLを返却する場合もあると教えてくれている。
関数を利用する側はNULLが発生するという前提に基づいてプログラムを組むことになる。上記のコード中でif (x != null && y != null)
とNULLのチェックを行っているが、これを取ってしまうと、コンパイルエラーが発生するのだ。
コンパイルエラーが出るのはうっとおしい気がするかもしれないが、実行時にNullPointerException
例外が発生するよりはずっとましだろう。
Javaで記述
対比ができるようにJavaでも同じものを記述してみよう。
public class Exp07 {
private static Integer parseInt(String str) {
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
System.out.println("One of the arguments isn't Integer");
}
return null;
}
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("No number supplied");
} else {
final Integer x = parseInt(args[0]);
final Integer y = parseInt(args[1]);
if (x != null && y != null) {
System.out.println(x * y);
} else {
System.out.println("One of the arguments is null");
}
}
}
}
parseInt
関数の戻り値の型がInteger
となっている。これはint
型がNULLを許容しないためだ。
コメント
コメントを投稿