[英]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.
}
}
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.