当同一个 class 中有一个空构造函数时,是否会绕过带有 args 的构造函数?
Does a constructor with args get bypassed when there is an empty constructor in the same class?
调用 classTwo.classTwoMethod() 时,classTwo 是如何为空的?我假设它与有一个空的 args 构造函数有关,但我不知道为什么。
public class ClassOne extends AccessibilityService {
IClassTwo classTwo;
public ClassOne(){}
public ClassOne(IClassTwo classTwo){
this.classTwo = classTwo;
}
@Override
public boolean onKeyEvent(KeyEvent event) {
classTwo.classTwoMethod();
return super.onKeyEvent(event);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
我在 MyApp class 中调用构造函数,我在其中传递 ClassTwo 的实例,如下所示:
public class MyApp extends Application {
ClassTwo classTwo;
ClassOne classOne;
@Override
public void onCreate() {
super.onCreate();
classTwo = new ClassTwo();
classOne = new ClassOne(classTwo);
checkAccessibilityPermission();
}
public boolean checkAccessibilityPermission() {
int accessEnabled=0;
try {
accessEnabled = Settings.Secure.getInt(this.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return false;
}
}
但是我得到了错误:
原因:java.lang.NullPointerException:尝试在 classTwo.classTwoMethod();
的空对象引用上调用接口方法 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()'
这是 ClassTwo:
public class ClassTwo implements IClasstwo {
@Override
public void classTwoMethod() {
//irrelevant
}
}
这是堆栈跟踪:
2021-04-04 18:42:33.609 32480-32480/com.example.wearableinterfaceproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wearableinterfaceproject, PID: 32480
java.lang.RuntimeException: Unable to create application com.example.wearableinterfaceproject.MyApp: java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()' on a null object reference
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6717)
at android.app.ActivityThread.access00(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()' on a null object reference
at com.example.wearableinterfaceproject.ClassOne.method(ClassOne.java:19)
at com.example.wearableinterfaceproject.ClassOne.<init>(ClassOne.java:15)
at com.example.wearableinterfaceproject.MyApp.onCreate(MyApp.java:17)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6712)
at android.app.ActivityThread.access00(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
您的 onKeyEvent 方法在 ClassOne 的范围之外,因此您无法直接访问 classTwo 变量。通过应用程序状态获取 classTwo 变量。在您的 onkeyevent 方法中添加以下代码,并向您的 MyApp class 添加一个 getClassOne 方法,该方法 returns 是 ClassOne 的一个实例。
MyApp appState = ((MyApp)this.getApplication());
ClassOne co = appState.getClassOne();
co.classTwo.classTwoMethod();
调用 classTwo.classTwoMethod() 时,classTwo 是如何为空的?我假设它与有一个空的 args 构造函数有关,但我不知道为什么。
public class ClassOne extends AccessibilityService {
IClassTwo classTwo;
public ClassOne(){}
public ClassOne(IClassTwo classTwo){
this.classTwo = classTwo;
}
@Override
public boolean onKeyEvent(KeyEvent event) {
classTwo.classTwoMethod();
return super.onKeyEvent(event);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
我在 MyApp class 中调用构造函数,我在其中传递 ClassTwo 的实例,如下所示:
public class MyApp extends Application {
ClassTwo classTwo;
ClassOne classOne;
@Override
public void onCreate() {
super.onCreate();
classTwo = new ClassTwo();
classOne = new ClassOne(classTwo);
checkAccessibilityPermission();
}
public boolean checkAccessibilityPermission() {
int accessEnabled=0;
try {
accessEnabled = Settings.Secure.getInt(this.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return false;
}
}
但是我得到了错误: 原因:java.lang.NullPointerException:尝试在 classTwo.classTwoMethod();
的空对象引用上调用接口方法 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()'这是 ClassTwo:
public class ClassTwo implements IClasstwo {
@Override
public void classTwoMethod() {
//irrelevant
}
}
这是堆栈跟踪:
2021-04-04 18:42:33.609 32480-32480/com.example.wearableinterfaceproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wearableinterfaceproject, PID: 32480
java.lang.RuntimeException: Unable to create application com.example.wearableinterfaceproject.MyApp: java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()' on a null object reference
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6717)
at android.app.ActivityThread.access00(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.wearableinterfaceproject.IClasstwo.classTwoMethod()' on a null object reference
at com.example.wearableinterfaceproject.ClassOne.method(ClassOne.java:19)
at com.example.wearableinterfaceproject.ClassOne.<init>(ClassOne.java:15)
at com.example.wearableinterfaceproject.MyApp.onCreate(MyApp.java:17)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6712)
at android.app.ActivityThread.access00(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
您的 onKeyEvent 方法在 ClassOne 的范围之外,因此您无法直接访问 classTwo 变量。通过应用程序状态获取 classTwo 变量。在您的 onkeyevent 方法中添加以下代码,并向您的 MyApp class 添加一个 getClassOne 方法,该方法 returns 是 ClassOne 的一个实例。
MyApp appState = ((MyApp)this.getApplication());
ClassOne co = appState.getClassOne();
co.classTwo.classTwoMethod();