我不知道';“我不明白,为什么我会出错”;java.lang.NullPointerException“;取而代之的是;main活动:onCreate:test+;“1”;,如何修复它?

我不知道';“我不明白,为什么我会出错”;java.lang.NullPointerException“;取而代之的是;main活动:onCreate:test+;“1”;,如何修复它?,java,android,dagger-2,Java,Android,Dagger 2,帮助我理解,为什么我得到错误“java.lang.NullPointerException”而不是“MainActivity:onCreate:test+1”,以及如何修复它 我的代码如下: //App.java public class App extends Application implements HasAndroidInjector { @Inject DispatchingAndroidInjector<Object> dispatchingAndroidInj

帮助我理解,为什么我得到错误“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;
    }
}

结果是确定的:“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

错误很简单:变量未初始化。根据生成的代码判断,如果未使用基类构造函数(SubBase mSubBase),则不会调用基类成员对象类。如何强制dagger在字段中注入?

我相信
@inject
只适用于框架创建的实例。至少Spring框架是这样工作的。由于您使用
new
操作符创建实例,因此您负责对其进行完全初始化,即需要将
mSubBase
设置为一些非空引用。如果出现异常,请始终包含完整堆栈跟踪,而不是让所有人都猜出错误。
//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;
    }
}
//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
    }
}
//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();
    }
}
    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)