getExternalCacheDirsで結果にnullが入ることがある? | Androidアプリ開発

※当サイトはアフィリエイト広告を利用しています。

Androidアプリ開発において、getExternalCacheDirsで結果にnullが入ることがある現象について記載します。
スポンサーリンク


現象

「現象」というタイトルにしてますが、この現象は私のスマホでは再現しないため直接の現象はわかりません。ひとまず分かっている情報を記載しておきます。

この現象は以下のようなコードで発生します。
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File[] files = getExternalCacheDirs();
        for(File file : files) {
            String path = file.getPath(); //ここでNullPointarExceptionになる!
        }
    }
}

上記の例ですと、filesになぜかnullが入ることがあります。この場合にはその要素にアクセスすると、当然、NullPointarExceptionでアプリがクラッシュします。

この現象の発生するデバイスは非常に少ないようです。数万人のユーザがいるアプリのFirebase crashlyitcsを見ると、数件のみのようです。ただし、なぜかGalaxyの発生率は高いです。

対処方法?

対処方法としてはFileオブジェクトにアクセスする前にnullかどうかを判定すればOKです。

以下、サンプルコードです。
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File[] files = getExternalCacheDirs();
        for(File file : files) {
            if(file == null) continue;
            String path = file.getPath();
        }
    }
}

ひとまず、上記のようなコード構成にすればNullPointarExceptionは回避でき、Crashlyticsのイベントはなくなりますが、相手のスマホでどのような挙動になっているかは不明です。

for文の中が一切通らずに終わる?それとも、filesと共にきちんとしたFileオブジェクトが入っている?

まとめ

Androidアプリ開発において、getExternalCacheDirsで結果にnullが入ることがある現象について記載しました。