2017-08-30 4 views
0

私は何とかAndroidスタジオにあるmethod invocation may produce nullPointerexceptionの警告をすべてカバーしようとしています。アクティビティを再起動して、nullPointerExceptionを処理するように練習してください。

私はこの問題に関する多くの話題を読んでおり、可能な例外を処理するためのベストプラクティスは、オブジェクトの値(nullまたはnot null)をチェックすることであるという結論に達しました。

にもかかわらず(理論上は)以下の私の例では、オブジェクトがnull値持っていることはありません:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

を私はまだAndroidのメーカーは、次の行がNullPointerExceptionを引き起こす可能性があることを警告します:

mCurrentUser = user.getUid(); 

私は、userが実際にnullになることができる孤立したケースが考えられました。これは、私が書いたコードではありません。 (非常に低い可能性:Firebaseが何らかの形で私のユーザの検索に失敗するとしよう)。 ユーザーの価値をチェックしたにもかかわらず、彼が実際にnullになる場合、私のコードはどのように実行されるのですか?それをデフォルト値にすることはできますか?

私はできません。デフォルト値を与えると、その実際のユーザーに関するデータベースデータを読み取ろうとすると災害が発生します。

私は「(userを取得する全体のプロセスが再び行われることになるように)トーストを表示し、活動を再開することによって回避策を試みた

 if(user != null) 
    { 
     mCurrentUser = user.getUid(); 
    } 
    else{ 
     Toast toast = Toast.makeText(getBaseContext() , "Oops, something went wrong!" , Toast.LENGTH_LONG); 
     toast.show(); 
     finish(); 
     startActivity(getIntent()); 
    } 

しかし、私は私の解決策は、にISNことはかなり怖いですベストプラクティス。 このようなイベントをよりうまく処理するにはどうすればよいですか?

+0

通常、このような状況では、ユーザーにログイン画面を提示する必要があります(ある場合)。また、失敗したアクションを繰り返すために(例えばアラート経由で)提供することもできます。繰り返し試行すると成功する可能性があります。 – algrid

答えて

2

まず、NullPointerExceptionについて話しているときに、私たちはExceptionについて話しており、警告ではありません。この種類の例外は、アプリケーションがnullの値を持つオブジェクト参照を使用しようとするとスローされます。

次に、この例外を「処理する」ことがベストプラクティスであることがわかりました。これはなんらかの種類のものです。私はあなたが例外を処理するために探していないと思う、この場合はtry-catch blockを使用するためです。あなたが探していると思うのは、起こったことの例外を避けることです。そのため、オブジェクト参照がnullまたはいずれかの値を保持できるため、nullをチェックしています。

ユーザーが実際にnullになる可能性がある孤立したケースがある場合でも、この場合は避ける必要があります。これは、オブジェクトの実際の状態を確認できる単一の方法であるため、無効の場合は処理を行う必要があります。これはFirebaseUserオブジェクトに関するものなので、認証について説明しています。オブジェクトがaの値を持つ場合については、今話していません。オブジェクトがnullの場合、何らかの形でユーザーを取得できなかったことを意味します。この場合、ユーザーエクスペリエンスのために、ユーザーをログインアクティビティにリダイレクトすることをお勧めします。

実際にデフォルト値(SharedPreferences)を保存することはできますが、あなたが設定したユーザーではなく正しいユーザーを使用しようとしているため、これは推奨されません。だから、あなたは正しいものを得るために必要なすべてを作る必要があります。結論として、無効の場合は、ログインアクティビティがない場合はユーザにメッセージを表示し、再度ログインを強制するか、ログインアクティビティにリダイレクトして実際に再試行して正しいユーザを取得します。

希望します。

+0

これは私が実際に必要としている説明です。そして、はい、私はユーザーをリダイレクトできるログインアクティビティを持っています。それは理にかなっている。ありがとうございました –

関連する問題