android.content.Context.getPackageName()在空对象引用上的问题

100

我正在使用实现接口的片段进行工作。

public class SigninFragment extends Fragment implements SigninInterface 

片段类中接口的方法实现如下所示。

@Override
public void afterSubmitClicked(String userId, Bundle bundle) {

    Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);
    
    if(!userId.equals("-1")){
        //Logged in successfully
        //Move to MusicHome
        
        Intent mIntent = new Intent(getActivity(),MusicHome.class);
        mIntent.putExtra("SigninFragment.user_details", bundle);
        startActivity(mIntent);
        
    }else{
        //Logging in failed
        //show error dialog
    }
    
}

这个方法是在执行一个扩展了AsyncTask的异步任务类之后被调用的。

但我遇到了崩溃。 错误信息显示:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

日志记录器

   02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.ComponentName.<init>(ComponentName.java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.Intent.<init>(Intent.java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.finish(AsyncTask.java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Looper.loop(Looper.java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Method.java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
18个回答

1
你可以使用try/catch来解决这个问题。当用户在启动意图之前关闭应用程序时,就会发生这种崩溃。
try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}

很好的答案。这正是我的问题所在。我有一个倒计时器,在onFinish方法中创建一个意图。但如果用户按下返回按钮回到之前没有创建计时器的活动,则会得到一个空对象引用,因为getActivity()将不再起作用。这对于用户离开活动后未关闭的线程也可能有用。万分感谢! - Chris Gong

0

您可以轻松解决问题并在活动中任何地方使用您的活动,只需像这样存储活动:

public class MainActivity extends AppCompatActivity{
      Context context = this;

      protected void onCreate(Bundle savedInstanceState) {....}

      AnotherClass {
          Intent intent = new Intent(context, ExampleActivity.class);
          intent.putExtra("key", "value");
          startActivity(intent);
      }

}

0
有时候startActivity方法会抛出异常,特别是在Fragments中:
Activity上下文之外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?
所以你应该使用intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)方法。

0
如果在获取“context”时发生此错误,则意味着您在调用它之前删除了上下文。假设您想在“fragment”中获取“Toast”,并且在调用“Toast”之前删除了“fragment”。
Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show()

所以解决方案要么等待Toast发生后再移除或更改片段,要么在更改或移除片段之前移除Toast或任何需要context的东西。

0

可以在全局使用

Context context;

创建一个构造函数并传递上下文。 LoginClass是类的名称

LoginClass(Context context)
{this.context=context;}

还有,当我们调用类时使用getApplicationContext,像这样:LoginClass lclass = new LoginClass(getApplicationContext)就可以了。


0

由于API23及以上版本中已弃用onAttach... 在我的Fragment中,每次进入Fragment之前我都会先声明和设置parentActivity。最有可能是因为当我们按下返回按钮时,上下文变为空了。因此,以下是我的解决方案。

private Activity parentActivity;

public void onStart(){
        super.onStart();
        parentActivity = getActivity();
//...

}

0
  public MessageAdapter(Context context, List<Messages> mMessageList) {

    this.mContext = context;
    this.mMessageList = mMessageList;

  }

-1

In Kotlin

lateinit var views:View?
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
     views=inflater.inflate(R.layout.fragment_dashboard, container, false)
   Toast.makeText(views.context ,"hello",Toast.LENGTH_LONG).show()
   return views;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接