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

我试图调用接口OnSelectedListener的方法getFailureDialog() 。 该方法在MainActivity.java实现。 但是当我调用该方法时,我得到空指针exception。

我知道它是因为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(); } 

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

 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) 

 OnSelectedListener mCallback; 

永远不会被初始化,或者正在使用空值进行初始化。

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

这是OnSelectedListener的源代码。 由于这是一个接口,你必须使用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 } } 

现在使用setOnSelectedListener()初始化您的侦听器

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

你必须重新设计你的代码man,使Common类实现OnSelectedListener接口。 因此将OnSelectedListener作为外部接口而不是内部接口分开。

我会像这样编码。

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

这段代码将顺利运行。 如果需要在MainActivity中实现getFailureDialog,请将此Common类作为抽象类。

普通class会是这样的

 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。 在Common中添加一个基本构造函数。 然后激活回调,如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"); } }