Я не понимаю, почему я получаю ошибку «java.lang.NullPointerException» вместо «MainActivity: onCreate: test +1», и как ее исправить? - PullRequest
0 голосов
/ 08 ноября 2019

Помогите мне понять, почему я получаю ошибку "java.lang.NullPointerException" вместо "MainActivity: onCreate: test +1" и как ее исправить?

Мой код ниже:

//App.java
public class App extends Application implements HasAndroidInjector {
    @Inject DispatchingAndroidInjector<Object> dispatchingAndroidInjector;

    @Module(includes = {AndroidSupportInjectionModule.class})
    interface AppModule {
        @ContributesAndroidInjector(modules = {ActivityModule.class})
        MainActivity provideActivity();
    }

    @Component(modules = {AppModule.class})
    interface AppComponent {
        void inject(App app);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        DaggerApp_AppComponent.create().inject(this);
    }

    @Override
    public AndroidInjector<Object> androidInjector() {
        return dispatchingAndroidInjector;
    }
}

//ActivityModule.java
@Module
    class ActivityModule {
        @Provides
        Base provideBase(){
            return new Base("test");
        }
    }
//MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Inject Base mBase;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity", "onCreate: " + mBase.getString());
    }
}
//Base.java
public class Base {

    private String mString;

    public Base(String string) {
        mString = string;
    }

    public String getString() {
        return mString;
    }
}

Результат в порядке: "MainActivity: onCreate: test", но если я добавлю подкласс в Base.class, я получу ошибку

//SubBase.java
public class SubBase {                        //<- add
                                              //<- add
    private String mString;                   //<- add
                                              //<- add
    public SubBase(String string) {           //<- add
        mString = string;                     //<- add
    }                                         //<- add
                                              //<- add
    public String getString() {               //<- add
        return mString;                       //<- add
    }                                         //<- add
}                                             //<- add
//Base.java
public class Base {

    private String mString;
    @Inject SubBase mSubBase;                 //<- add

    public Base(String string) {
        mString = string;
    }

    public String getString() {
        return mString+mSubBase.getString();  //<- change
    }
}
//ActivityModule.java
@Module
class ActivityModule {
    @Provides
    Base provideBase(){
        return new Base("test");
    }

    @Provides                                 //<- add
    SubBase provideSubBase() {                //<- add
        return new SubBase(" +1");            //<- add
    }
}

Ошибка результата: "java.lang.NullPointerException", но я ожидал "MainActivity: onCreate: test +1" `

UPDATE1 Я не хочу этого делать:

//ActivityModule.java
@Module
class ActivityModule {
    @Provides
    SubBase provideSubBase() {
        return new SubBase(" +1");
    }

    @Provides
    Base provideBase(SubBase subBase){          //<- change
        return new Base("test", subBase);       //<- change
    }

}
//Base.java
public class Base {

    private String mString;
    private SubBase mSubBase;                           //<- add

    public Base(String string, SubBase subBase) {       //<- change
        mString = string;
        mSubBase = subBase;                             //<- add 
    }


    public String getString() {
        return mString + mSubBase.getString();
    }
}

UPDATE2 трассировка полного стека

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: io.softline.dagger, PID: 14071
    java.lang.RuntimeException: Unable to start activity ComponentInfo{io.softline.dagger/io.softline.dagger.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String io.softline.dagger.SubBase.getString()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String io.softline.dagger.SubBase.getString()' on a null object reference
        at io.softline.dagger.Base.getString(Base.java:24)
        at io.softline.dagger.MainActivity.onCreate(MainActivity.java:36)
        at android.app.Activity.performCreate(Activity.java:6679)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

Ошибка проста: переменная не инициализирована. Судя по сгенерированному коду, класс Base_MembersInjector не вызывается, если конструктор базового класса (SubBase mSubBase) не используется. Как заставить кинжал вводить в поле?

...