yak shaving life

遠回りこそが最短の道

JavaのUnboxingでNullPointerExceptionが出てほしくない

Java初心者なので、戻り値の型がLongAPIを使いたいけどnullとか嫌だからlongにしちゃおーといって適当にAuto boxingしたらNullPointerExceptionが出てしまった。こんな感じ。

// SomeLibrary#count の戻り値の型はLong
long count = SomeLibrary.count();  // => NullPointerException

あれ、そうだっけ?nullだったら勝手に0lとかになってくんないの?と思ってJShellでも試してみる。

jshell> Long wrapper = null;
wrapper ==> null

jshell> long primitive = wrapper;
|  例外java.lang.NullPointerException
|        at (#2:1)

まあそもそもラッパークラスになってる時点でnullを許容する必要があり、nullであるという状態は何かしらの意味を持っている(はず)のだからちゃんとnullの時に対応するコードをかけということだとは思うけれども、それでもなおnullとかいらねーよというときはある。皆さんもあるでしょう。多分。結局Optional使ってこんな感じで書けばいいということだろうか。

jshell> long primitive = Optional.ofNullable(wrapper).orElse(0l);
result ==> 0

Optionalがなかったら一旦Long型の変数に入れてからif文でnullチェックして云々みたいなことが必要そうなので、Optionalのおかげで少しは書きやすくなっているということだろうか。しかし、本質的には明示的なnullチェックとそんなに変わらない気がするし、どうせだったらnull合体演算子とかエルビス演算子みたいなの導入してくんないかなあ。long primitive = wrapper ?: 0l とかで書ければ楽なんだけどねえ。