我不知道';“我不明白,为什么我会出错”;java.lang.NullPointerException“;取而代之的是;main活动:onCreate:test+;“1”;,如何修复它?
帮助我理解,为什么我得到错误“java.lang.NullPointerException”而不是“MainActivity: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
//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)