怖い、暗黙の型変換

3月4日月曜日、雨

しとしとしとしと。昨晩から降り続く雨──! 雨。雨は嫌だなあ……。

* * *

しかしなんたる僥倖か。今日は在宅勤務を申請していたのである!(ラッキー!)

(前日までに上長に申請して許可をもらわないと使えないというあたり、まだまだ固いし、勤務開始と終了に寄せてメールを出さないといけないというルールがなんとも言えずなんとも言えない。別途 WEB で勤怠システムに打刻するのに、だぜ? このメールにはなんの意味があるんだろう? 出勤しているなら挨拶するから気づくけど、在宅だといるのかいないのか、仕事始めているのかそれとも休憩中なのか、目で見てわからないから──? 裁量で仕事をさせることになっているんだったら、勤務時間はさておいて「何を」「どれだけ」という成果で測れるようにしないとダメなんじゃないかね? どうなのかね? まああれだ。これは僕の仕事がプログラムを書くことで、常時接続で社内チャットシステムにも繋がっているし、誰かが送信したメッセージにエモティコンつけたり、「わからん」とつぶやく書き込みに時間差なくレスがついたりする環境にいるから「陳腐」と感じるんだろう。もう少しヒューマンな労働を基本にしている職場環境だったら…… だったら在宅での作業って持ち帰ってこれ、これだけという「内容」と「量」とがやっぱり大事で、メールでの勤務開始・終了報告なんてちゃんちゃら可笑しくてへそが茶を沸かしやしないか? ピッピー! まあそうは言っても、ほら、残業させないとか就業時間は守らせようとか、そういう観点で見るなら「けじめ」の意味で効果は無きにしも非ずかもしれないね)

* * *

本日の業務中に悩んだバグ。仕込みが数週間前だっただけに、なかなか難しかった。

Integer getInt(String key, Integer defaultValue) {
  if (map.contains(key)) {
    return map.getInt(key, 0);
  } else {
    return defaultValue;
  }
}

オリジナルがこんな感じだったところ、数週間前に三項演算子を使ってまとめてしまっていた。

Integer getInt(String key, Integer defaultValue) {
  return map.contains(key) ? map.getInt(key, 0) : defaultValue;
}

そしてこの状態で実行すると「getInt() が null に対して呼ばれました」とエラーメッセージが出てクラッシュする。この getInt() をもっと虚心坦懐に見られたらよかったんだけれど、別の置き換えをしている最中だったので map が null になっているに違いないと思いこんでしまった。

でもおかしいよね。それなら map.contains() の呼び出し時点で落ちるはずじゃない?

型を明示していないので分かりづらいけれど(実際エディターでも出てこないしね)、原因は map.getInt(String, int) の戻り値型が int だということ。これにより三項演算子の式の型が int に強制される。だから map が key を含んでいなかった場合 defaultValue を int に変換するため Integer.getInt() が呼ばれる。よって defaultValue が null だとクラッシュする。

もとの if 文なら map.getInt(key, 0) の戻り値 int が Integer にラップされるか、あるいは Integer として渡ってきた defaultValue がそのまま返るかということで、(暗黙の)型変換怖い、という話でした。(Java でも)

この記事が気に入ったらサポートをしてみませんか?