Fabric이 설명 할 수없는 몇 가지 NPE 발생에 대해 이야기했습니다. 그들은 다른 장치 및 안드로이드 버전에서 발생합니다. 항상 GameLogic 인스턴스를 초기화에서 onCreate()에서 이미 조각에 전달 활동에 대한조각에 불가능한 NPE
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{lelisoft.com.lelimath/lelisoft.com.lelimath.activities.CalcActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
at android.app.ActivityThread.access$900(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.NullPointerException
at lelisoft.com.lelimath.fragment.CalcFragment.setupPlay(CalcFragment.java:253)
at lelisoft.com.lelimath.fragment.CalcFragment.onActivityCreated(CalcFragment.java:86)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1272)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2149)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:600)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
at lelisoft.com.lelimath.activities.LeliBaseActivity.onStart(LeliBaseActivity.java:94)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1177)
at android.app.Activity.performStart(Activity.java:5461)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2301)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
at android.app.ActivityThread.access$900(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(NativeStart.java)
이제 소스 코드 :
public class CalcFragment extends LeliBaseFragment {
CalcLogic logic;
public void setLogic(CalcLogic logic) {
this.logic = logic;
}
public void onActivityCreated(Bundle state) {
setupPlay();
}
:
public class CalcActivity .. {
GameLogic gameLogic;
protected void onCreate(Bundle state) {
setContentView(R.layout.act_calc);
setGameLogic(new CalcLogicImpl());
calcFragment = new CalcFragment();
calcFragment.setLogic((CalcLogic) gameLogic);
initializeCalcFragment(false);
}
private void initializeCalcFragment(boolean replace) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (replace) {
transaction.replace(R.id.calc_content, calcFragment);
} else {
transaction.add(R.id.calc_content, calcFragment);
}
transaction.commit();
}
public void setGameLogic(GameLogic gameLogic) {
this.gameLogic = gameLogic;
}
는 그런 다음 CalcFragment있다
그리고 여기서 NPE와 함께 실패합니다.
private void setupPlay() {
formulas = logic.generateFormulas();
}
흐름이 명확하고 다른 속성 할당이 없습니다. 활동이 작성되고, 특성이 인스턴스화되고 설정되며, 조각이 작성되고 특성이 전달됩니다. 그런 다음 단편은 onActivityCreated
으로 초기화되지만 속성이 null 일 때도 있습니다. 그것은 내 모든 실제 장치 및 가상 장치에서 잘 작동합니다. 내가보고 된 장치에서 왜 비어 있는지 전혀 모른다.
어디에서 gameLogic 변수를 초기화하나요? – Sanjeet
setter setGameLogic에서 onCreate를 참조하십시오. –
'LeliBaseActivity.onStart() '란 무엇입니까? 그것은 당신의 프래그먼트가 활성화되는 곳입니다. – kichik