null 객체 참조에 대한 android.content.Context.getPackageName () '


81

인터페이스를 구현하는 Fragments로 작업하고 있습니다.

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를 확장하는 AsynchronousTask 클래스를 추출한 후 호출됩니다.

하지만 충돌이 발생합니다. 그리고 오류 메시지는

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

Logcat

   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)

답변:


44

나는 내가 한 실수를 발견했습니다. 재정의 메서드 OnAttach ()에서 활동 인스턴스를 가져와야합니다. 예를 들면 다음과 같습니다.

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}

그런 다음 활동을 다음과 같이 컨텍스트로 전달하십시오.

Intent mIntent = new Intent(activity, MusicHome.class);

2
나에게 안드로이드 버그처럼 보이지만 좋은 해결 방법으로 문제가 해결되었습니다!
반응 코어

5
onAttach가되지 않습니다
메나 - 알라 사미

6
@ Menna-AllahSami onAttach(Context context)는 아닙니다.
oldergod

3
@ Menna-AllahSami 활동을 매개 변수로 취하는 사람, 예. 맥락을 취하는 사람은 그렇지 않습니다.
oldergod

2
이것이 어떻게 문제를 해결하는지 모르겠지만 작동합니다.
Roshana Pitigala

40

이 질문에 대한 답변은 내 문제를 찾는 데 도움이되었지만 소스가 달랐으므로 '무작위'컨텍스트 충돌에 대한 답변을 검색하는이 페이지를 찾는 사람에게 빛을 비출 수 있기를 바랍니다.

SharedPreferences 개체를 지정하고 다음과 같이 클래스 수준 선언에서 인스턴스화하려고했습니다.

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

thisonCreate 이전에 참조 하면 "java.lang.NullPointerException : 널 오브젝트 참조에서 가상 메소드 'java.lang.String android.content.Context.getPackageName ()'호출 시도" 오류가 발생했습니다.

onCreate () 내부에서 객체를 인스턴스화하면 다음과 같이 문제가 해결되었습니다.

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

도움이 되었기를 바랍니다.


1
Application 클래스 생성자에서 getDefaultSharedPreferences ()를 호출하는 동안 동일한 문제가 발생했습니다 (공용 클래스 MyApplication은 Application을 확장 함). 귀하의 메시지는 내가 그것을 onCreate 메소드로 이동해야한다는 것을 확인하는 데 도움이되었습니다.
OlivierGrenoble

1
좋은 팁, 많은 도움이되었습니다
Allexandre S. 2010 년

23

안드로이드 API 레벨 23.

사용하다

getContext ()

대신에

getActivity ()

getActivity ()는 부모 Activity, Context 객체를 제공합니다.

여기에서 사용할 수 있습니다

MyActivity.this

대신에

getActivity () / getApplicationContext ()


3
getContext ()를 사용하여 동일한 NPE를 얻습니다
Ricardo

일부 휴대 전화는 MyActivity.this (예를 들어, 하나의 플러스와 레노버)와 NPE를 얻을 수
Dagnogo 장 - 프랑수아

@ DagnogoJean-François 그 전화를 어떻게 해결합니까?
Sagar Pujari

다른 사람을 위해 일할 수 있지만 나를 위해 일하지 않습니다. 나는 Fragment.
VikaS GuttE

8

토스트를 조각으로 보여 주려고도 똑같은 문제가 발생했습니다.

디버깅 후 호출하기 전에 조각을 제거하고 있음을 알았습니다.

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();

조각이 제거 되었기 때문에 컨텍스트가 null이되어 예외가 발생했습니다.

간단한 해결책 : 조각을 getContext() 제거하기 전에를 호출하십시오 .


7

제 경우에는 Fragment이 줄 에서 오류가 발생했습니다 .

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

위의 코드를 트리거 한 항목을 두 번 클릭했을 때 발생하여 두 개의 SecondaryActivity.class활동이 동시에 시작되었습니다. 나는 정상 폐쇄 SecondaryActivity.class에 대한 호출을 트리거 누르면 다시 버튼으로 활동을 getActivity()SecondaryActivity.class전경에 온있다. getActivity()반환 된에 대한 호출 null입니다. 일종의 이상한 Android 버그이므로 일반적으로 발생하지 않아야합니다. 사용자가 한 번 클릭 한 후 클릭을 차단할 수 있습니다.



4

나에게 문제는 내가 Context가 아닌 생성자에 Activity를 전달한다는 것입니다.

public Adapter(Activity activity, List<MediaItem> items, boolean can) {
    mItems = items;
    canEdit = can;
    mActivity = activity;
}

이 활동을 getDefaultSharedPreferences ()에 사용하여 활동을 Context로 변경하고 MainActivity.this를 사용하여 여전히 Adapter 생성자를 호출했습니다.


4

제 경우에는 recyclerview 어댑터, 컨텍스트 컨텍스트에 onCLick 메서드가 있습니다. 처음에.

 holder.cTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, StoryActivity.class);
                    intent.putExtra("STORY", mComments.get(position));
                    context.startActivity(intent);
                }
            });

그리고 나는 현재보기에서 컨텍스트를 얻기 위해 변경했습니다.

 holder.cTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), StoryActivity.class);
                    intent.putExtra("STORY", mComments.get(position));
                    v.getContext().startActivity(intent);
                }
            });

1

제 수업은 Activiti로 확장되지 않습니다. 이런 식으로 문제를 해결했습니다.

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.java))
            })
          ...
    }

1

활동 앞에 조각 이름을 넣으십시오.

Intent mIntent = new Intent(SigninFragment.this.getActivity(),MusicHome.class);

0

try / cat으로 문제를 해결합니다. 이 충돌은 사용자가 시작 의도 전에 앱을 닫을 때 발생합니다.

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}

좋은 대답입니다. 이것은 나에게 일어난 일입니다. onFinish메서드 에서 인 텐트를 생성하는 카운트 다운 타이머가 있습니다 . 그러나 사용자가 타이머가 생성되지 않은 이전 활동으로 이동하기 위해 뒤로 버튼을 눌렀다면 getActivity ()가 더 이상 작동하지 않기 때문에 null 객체 참조를 얻습니다. 이것은 사용자가 활동을 떠난 후 닫히지 않은 스레드에도 유용 할 수 있습니다. 무리 감사!
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

Due to onAttach는 API23 이상에서 더 이상 사용되지 않습니다 ... 내 Fragment에서 parentActivityFragment로 이동할 때마다 미리 선언하고 설정 합니다. 대부분의 경우 뒤로 버튼을 눌렀을 때 컨텍스트가 null이 되었기 때문에 발생합니다. 따라서 아래는 내 해결책입니다.

private Activity parentActivity;

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

}

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

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

  }

0

글로벌에서 사용 가능

Context context;

생성자를 만들고 컨텍스트를 전달합니다. LoginClass는 클래스의 이름입니다.

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

또한 우리가 클래스를 호출 할 때 그 getApplicationContext 와 같이 사용 LoginClass lclass = new LoginClass(getApplicationContext) 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.