【问题标题】:Does a constructor with args get bypassed when there is an empty constructor in the same class? [closed]当同一个类中有一个空的构造函数时,是否会绕过带有 args 的构造函数? [关闭]
【发布时间】:2021-06-30 19:25:18
【问题描述】:

调用classTwo.classTwoMethod()时classTwo如何为null?我假设它与有一个空的 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 类中调用构造函数,并在其中传递 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()”;

这是第二类:

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.access$1300(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.access$1300(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) 

【问题讨论】:

  • 在构造函数public ClassOne(IClasstwo classOne) 中,您将参数命名为“classOne”,但在构造函数中,您尝试将其分配为“classTwo”:this.classTwo = classTwo;。所以现在你将classTwo 分配给它自己,所以它仍然是null。将参数名称更改为“classTwo”即可。
  • 避免这种错字是使用现代 IDE 如此有用的原因之一。一旦我将您的代码粘贴到 Eclipse 中,它就很有帮助地强调了问题并显示“对变量的赋值无效”警告。人类很难发现这些类型的拼写错误,但编译器会立即注意到它们。
  • 抱歉,这只是问题中的一个错字。按照您的建议编写代码时,错误是相同的。我已经修正了问题中的那个错字。
  • @azurefrog 请看已编辑的问题
  • 错误显示...wearableinterfaceproject.IClasstwo.classTwoMethod()IClasstwo 有类型错误。应该是IClassTwo,不是吗?您的 ClassTwo 实现 IClasstwo 而不是 IClassTwo

标签: java android interface


【解决方案1】:

您的 onKeyEvent 方法超出了 ClassOne 的范围,因此您无法直接访问您的 classTwo 变量。通过应用程序状态获取您的 classTwo 变量。在 onkeyevent 方法中添加以下代码,并将 getClassOne 方法添加到返回 ClassOne 实例的 MyApp 类中。

MyApp appState = ((MyApp)this.getApplication());
        ClassOne co = appState.getClassOne();
        co.classTwo.classTwoMethod();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2012-06-22
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多