Помогите мне понять, почему я получаю ошибку "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) не используется. Как заставить кинжал вводить в поле?