【KotlinとJava】NULLチェック

07 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を許容しないためだ。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成

【Delphi Sample】並列プログラミング1