简体   繁体   English

在其他类中实现的调用接口方法上的空指针异常

[英]null pointer exception on calling interface method implemented in other class

I am trying to call the method getFailureDialog() of the interface OnSelectedListener . 我试图调用接口OnSelectedListener getFailureDialog()方法。 The method is implemented in MainActivity.java . 该方法在MainActivity.java实现。 But when I call the method, I am getting the null pointer exception. 但是当我调用该方法时,我得到了空指针异常。

I know that its because OnSelectedListener is still not initialized and you are calling getFailureDialog() on uninitialized object. 我知道这是因为OnSelectedListener仍未初始化,并且您在未初始化的对象上调用getFailureDialog() Obviously, interface methods are never initialized. 显然,接口方法永远不会初始化。 But then how do I call the method getFailureDialog() from my class Common.java ? 但是,如何从类Common.java调用方法getFailureDialog()呢?

I am placing only the relevant source code below- 我只在下面放置相关的源代码-

Source code: 源代码:

SharedFragment.java SharedFragment.java

public class SharedFragment extends DialogFragment 
{       
    Bundle bundle = getArguments();
    final String email = bundle.getString("email");

    Thread t=new Thread(new Runnable() 
    {
        public void run() {
        common.myRecord(email);
    }
    });   t.start(); 
}

Common.java 通用.java

public class Common
{
OnSelectedListener mCallback;


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}

MainActivity.java MainActivity.java

public class MainActivity implements Common.OnSelectedListener
{

@Override
    public void getFailureDialog()
    {

        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}

Error Log 错误记录

03-22 15:50:39.032: W/dalvikvm(20796): threadid=16: thread exiting with uncaught exception (group=0x4204c450)
03-22 15:50:39.052: E/AndroidRuntime(20796): FATAL EXCEPTION: Thread-30126
03-22 15:50:39.052: E/AndroidRuntime(20796): java.lang.NullPointerException
03-22 15:50:39.052: E/AndroidRuntime(20796):    at com.cornmail.util.Common.myRecord(Common.java:2062)
OnSelectedListener mCallback;

is never getting initialized, or is being initialized with a null value. 永远不会初始化,或者正在使用null值初始化。

public class Common
{
    OnSelectedListener mCallback = new OnSelectedListener(){
        public void getFailureDialog(){
            JOptionPane.showMessageDialog(null, "An Error Has Occurred.");
        }
    };


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //now this works.
    }
}

here is the source code for the OnSelectedListener . OnSelectedListener的源代码。 Since that is an interface, you have to initialize it using new and overriding the onSelected() method OR let your class implement this listener 由于这是一个接口,因此您必须使用new并覆盖onSelected()方法对其进行初始化,或者让您的类实现此侦听器

add a method in 在中添加方法

public class Common
{
    OnSelectedListener mCallback;

    public void setOnSelectedListener(OnSelectedListener listener){
        mCallback = listener;
    }

    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}

now use the setOnSelectedListener() to initialize your listener 现在使用setOnSelectedListener()初始化您的监听器

but from you code you might need to implement another listener in your SharedFragment too. 但是从您的代码中,您可能还需要在SharedFragment实现另一个侦听器。

You have to redesign your code man, make Common class implement OnSelectedListener interface. 您必须重新设计代码人,使Common类实现OnSelectedListener接口。 So separate OnSelectedListener as outer interface not as inner interface. 因此,将OnSelectedListener单独作为外部接口而不是内部接口。

i will code it like this. 我会这样编码。

public interface OnSelectedListener 
{
    public void getFailureDialog();
}

then Common class should be like this 那么Common班应该是这样的

public class Common implements OnSelectedListener
{
    public void getFailureDialog()
    {
        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }

    public void myRecord(String email)
    {
        getFailureDialog();
        //do something more rather than just call existing method
    }
}

and this code will run smoothly. 并且此代码将顺利运行。 if you need to implement the getFailureDialog in MainActivity, make this Common class as abstract class. 如果需要在MainActivity中实现getFailureDialog,请将此Common类作为抽象类。

Common class will be like this 普通班会是这样

public abstract class Common implements OnSelectedListener
{
    public abstract void getFailureDialog();

    public void myRecord(String email)
    {
        getFailureDialog();
        //do something more rather than just call existing method
    }
}

now your MainActivity class can extend from this class to implement the missing part. 现在您的MainActivity类可以从此类扩展以实现缺少的部分。

You need to modify Common and MainActivity. 您需要修改Common和MainActivity。 In Common add a basic constructor. 在Common中添加一个基本的构造函数。 Then activate the callback as shown in startMyCallback. 然后激活回调,如startMyCallback所示。

Common.java 通用.java

public class Common
{

 public Common() {}

 OnSelectedListener mCallback;


 public interface OnSelectedListener 
 {
    public void getFailureDialog();
 }

 public void myRecord(String email)
 {
    mCallback.getFailureDialog();  //null pointer exception here
 }
}

MainActivity.java MainActivity.java

public class MainActivity implements Common.OnSelectedListener
{

    Common common = new Common();

    public MainActivity()
    {

    }

    public void startMyCallback()
    {
        common.mCallback = this;
    }

    @Override
    public void getFailureDialog()
    {
        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM