Java 调用在其他类中实现的接口方法时出现空指针异常
我正在尝试调用SelectedListener接口Java 调用在其他类中实现的接口方法时出现空指针异常,java,android,nullpointerexception,Java,Android,Nullpointerexception,我正在尝试调用SelectedListener接口的方法getFailureDialog()。 该方法在MainActivity.java中实现。但是当我调用该方法时,我得到 空指针异常 我知道这是因为SelectedListener上的OnSelectedListener仍未初始化,而您正在对未初始化的对象调用getFailureDialog()。显然,接口方法从未初始化过。但是,如何从类Common.java调用方法getFailureDialog() 我只把相关的源代码放在下面- 源代码:
的方法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中,这样就很容易知道实现的方法属于这个类,而不必每次都搜索任何方法的实现在哪里接口的设计。