Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用在其他类中实现的接口方法时出现空指针异常_Java_Android_Nullpointerexception - Fatal编程技术网

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

Java 调用在其他类中实现的接口方法时出现空指针异常,java,android,nullpointerexception,Java,Android,Nullpointerexception,我正在尝试调用SelectedListener接口的方法getFailureDialog()。 该方法在MainActivity.java中实现。但是当我调用该方法时,我得到 空指针异常 我知道这是因为SelectedListener上的OnSelectedListener仍未初始化,而您正在对未初始化的对象调用getFailureDialog()。显然,接口方法从未初始化过。但是,如何从类Common.java调用方法getFailureDialog() 我只把相关的源代码放在下面- 源代码:

我正在尝试调用SelectedListener接口
的方法
getFailureDialog()
。 该方法在
MainActivity.java
中实现。但是当我调用该方法时,我得到 空指针异常

我知道这是因为SelectedListener上的
OnSelectedListener
仍未初始化,而您正在对未初始化的对象调用
getFailureDialog()
。显然,接口方法从未初始化过。但是,如何从类
Common.java
调用方法
getFailureDialog()

我只把相关的源代码放在下面-

源代码:

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(); 
}
public class Common
{
OnSelectedListener mCallback;


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}
public class MainActivity implements Common.OnSelectedListener
{

@Override
    public void getFailureDialog()
    {

        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}
Common.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(); 
}
public class Common
{
OnSelectedListener mCallback;


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}
public class MainActivity implements Common.OnSelectedListener
{

@Override
    public void getFailureDialog()
    {

        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}
MainActivity.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(); 
}
public class Common
{
OnSelectedListener mCallback;


    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //null pointer exception here
    }
}
public class MainActivity implements Common.OnSelectedListener
{

@Override
    public void getFailureDialog()
    {

        RecordFailure fd = new RecordFailure(); 
        fd.show(getSupportFragmentManager(), "dialog");
    }
}
错误日志

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)
从未初始化,或正在使用空值初始化

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.
    }
}
是选定侦听器的源代码。由于这是一个接口,您必须使用new并重写
onSelected()
方法初始化它,或者让您的类实现此侦听器

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
    }
}
现在使用
设置SelectedListener()
初始化您的侦听器


但是从您的代码中,您可能还需要在您的
SharedFragment
中实现另一个侦听器。

您必须重新设计您的代码员,使公共类在SelectedListener
接口上实现
。因此,将SelectedListener上的
分离为外部接口,而不是内部接口

我会这样编码

public interface OnSelectedListener 
{
    public void getFailureDialog();
}
那么
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
    }
}
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
    }
}
这段代码将顺利运行。 如果需要在MainActivity中实现getFailureDialog,请将此公共类设置为抽象类

普通班是这样的

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
    }
}
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
    }
}

现在,您的
MainActivity
类可以从此类扩展来实现缺少的部分。

您需要修改Common和MainActivity。通常,添加一个基本构造函数。然后激活回调,如startMyCallback所示

Common.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

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");
    }
}

是的,这是真的,但你能告诉我这是一个接口,以及如何初始化它吗?你不能初始化接口,这是一个多么糟糕的问题answer@demongill当然可以。例如,使用new View.OnClickListener和ovveride onClick()方法。这不是一般意义上的“初始化”过程,但我认为Kylar只是概括了我从未发现过像这样的设计接口作为我的经验。接口应该先在其他类中实现,然后再被其他类使用,这样您就没有足够的经验了。初始化匿名接口实现在Swing中非常常见。我同意您的看法,但必须有某种方法来调用接口方法,该接口方法是在其他类中使用我们类中的对象名实现的,这样当我执行object.method()时它不会给出空指针。公共类是包含大约2000行代码和许多实现方法的类。它不可能是抽象的。让我们等待其他答案,因为我会这样设计我的代码。你为什么要设计这样一个机构?有没有像这样编码的现有API库,请告诉我一些要点。我很乐意做一些研究。抽象类可以在其中实现方法,但可以实例化。您以前使用过抽象类吗?使用这种机制的主要思想是-整个应用程序中有很多接口,只有很少的方法。因此,为每个具有如此小代码的接口创建类是很尴尬的。把它放在一个类中是一个更好的主意,也是推荐的。另一个原因是-我把每个接口的所有实现方法都放在一个类MainActivity.java中,这样就很容易知道实现的方法属于这个类,而不必每次都搜索任何方法的实现在哪里接口的设计。