练习以通过重新启动活动来处理可能的nullpoInterException



我试图以某种方式涵盖我在Android Studio中获得的所有method invocation may produce nullPointerexception警告。

我已经阅读了很多有关此问题的主题,得出的结论是,处理可能的例外的最佳实践是检查对象的价值。(null或不是null)。

即使(理论上)我以下示例中的对象永远都不应具有零值:

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

我仍然收到Android Studio警告,以下行可能会导致NullPointerException

mCurrentUser = user.getUid();

然后,我认为可能有一个孤立的情况,即user实际上可以是null,这不是由我编写的代码引起的。(可能性很低:假设Firebase会以某种方式无法检索我的用户)。

我问自己的下一个问题是:即使我检查了用户的价值,如果他的代码为无效,我的代码将如何执行?我可以给它一个默认值吗?

我不能。因为给他一个默认值会在我尝试阅读有关该实际用户的数据库数据时会造成灾难。

我通过显示敬酒并重新启动活动尝试了工作(以便将重新检索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());
    }

,但我很害怕我的解决方案不是最好的做法。我应该如何处理此类事件?

首先,当我们谈论的是NullPointerException时,我们正在谈论Exception而不是警告。当应用程序尝试使用具有null值的对象引用时,会抛出此类例外。

第二,您发现最好的做法是"处理"此例外,这是某种真实的。我认为您不想处理例外,因为在这种情况下,您将使用try-catch block。我认为您正在寻找的是避免发生这种情况。这就是为什么您要检查无效的原因,因为对象引用可以为null或可以保存值。

即使可能有一个孤立的情况,用户实际上可能是无效的,您也需要避免这种情况。因为这是我们可以验证对象的实际状态的单一方法,如果您需要采取措施,则需要采取行动。因为这是关于FirebaseUser对象的,所以我们在谈论身份验证。我们现在不是在谈论对象具有值的情况。如果对象为null,则意味着您无法以某种方式获得用户。在这种情况下,对于用户体验,我建议您将用户重定向到登录活动。

您实际上可以存储一个默认值(即在共享流程中),但这不是推荐的,因为您希望使用正确的用户而不是用户设置的用户。因此,您需要做所有必要的东西才能获得正确的一个。

作为结论,如果没有登录活动,请向用户显示一条消息,并迫使他再次登录,或将用户重定向到登录活动以实际重试以获取正确的用户。

希望它有帮助。

最新更新