#はじめに
みなさん!コーディング時の警告はちゃんと解消してますよね?
ただ、「はいはいいつものやついつものやつ」とか「またこれねハイハイ」とか容易にソースを修正してませんか?
特にテストやらなんやら終わった後のクラスとかで「あれ?警告でてるじゃん、消しとこ」とかで軽い気持ちで修正しちゃったりとかありませんか?
その修正が思わぬ不具合につながるかもしれませんよ?
#まえおき
理解してる人はあたりまえの話なのでそこはあたたかい目で読んでいただければと思います
例を作るにあたり、いろいろ突っ込みどころがあると思いますがご容赦を・・・!
#ほんだい
極端な例ですが、例えばこんなclassがあったとします。
public class TestClass {
TestClass() {
hogeInt hogeInt = new hogeInt();
...
if (特定の条件) {
Log.d("TAG", "前");
Boolean flg = hogeInt.getIntParam().equals(1);
Log.d("TAG", "後");
Toast.makeText(context,"サーバーに truncate table * のクエリを投げました",Toast.LENGTH_LONG).show();
}
...
}
}
class hogeInt {
private Integer intParam = null;
@Nullable
public Integer getIntParam() {
return this.intParam;
}
public void setIntParam(Integer intParam) {
this.intParam = intParam;
}
}
そして特定の条件内に入るのが極稀なケースだったとします。
ここでひとつPointなのですが、これを何もせずに実行した場合、
Toast.makeText(context,"サーバーに truncate table * のクエリを投げました",Toast.LENGTH_LONG).show();
が実行される前にクラッシュします。
( hogeInt.getIntParam() はNull なのに equals を実行しようとしているので)
そして本題。
Boolean flg = hogeInt.getIntParam().equals(1);
こいつは警告として表示されます。
今回だと「’NullPointerException’を生成する可能性があります」ってやつですね。わりかしよく見かける部類の警告だと思います。
これをアプリ改良中に「あれ?ここ警告でてるからついでに修正しておこう」とか「そういえばたまにクラッシュ報告あるけどこいつかも」
といった軽い感じで何も考えずにソースを修正した場合
ソースがこう変化します
public class TestClass {
TestClass() {
hogeInt hogeInt = new hogeInt();
...
if (特定の条件) {
Log.d("TAG", "前");
if (hogeInt != null) {
Boolean flg = hogeInt.getIntParam().equals(1);
}
Log.d("TAG", "後");
Toast.makeText(context,"サーバーに truncate table * のクエリを投げました",Toast.LENGTH_LONG).show();
}
...
}
}
今までクラッシュしていた部分をnullチェックでスルーする事によって後続が流れるようになり、めでたくサーバにTruncate文が投げられる事になりました。
ちなみに今回のお話は**警告は残しておいてもいいよ!**という事ではなく、小さな警告を消す場合でも慎重になれという事です。
何かしら修正を入れる場合、その一文だけを見ずに、全体の流れをちゃんと把握した上で修正しましょう!