5

パッケージ名を使用して特定のアプリを開こうとしています。そのために、次のコードを使用しています。

public void openAppHavingPackageName(String packageName, String appName) {
        try {
            Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(packageName);
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Log.e(TAG, e.getMessage());
        }
}

携帯電話にインストールされているアプリを開こうとすると正常に動作しますが、携帯電話にないアプリを開こうとすると、アプリがクラッシュして次のエラーが発生します。

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference

ライン上

startActivity(intent);

ご覧のとおり、try/catchそこにブロックがあるのに、なぜ例外が追いつかず、代わりにコードが実行されてクラッシュするのでしょうか?

4

1 に答える 1

3

NullPointerExceptiontry catch範囲内で暗示されていないと、ブロックでキャッチできませんcatch。これはランタイム例外であり、try catchブロックを処理する代わりに回避することをお勧めします。

if(something != null) {
   doStuff();
}

コードでNullPointerException例外を処理するには、次のようにする必要があります。

try {
    Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(packageName);
    startActivity(intent);
} catch (ActivityNotFoundException | NullPointerException e) {
    Log.e(TAG, e.getMessage());
}

繰り返しますが、この方法はお勧めできません。

于 2017-09-06T13:02:55.857 に答える