2 Stimmen

Null pointer Ausnahme beim Aufruf der Schnittstellenmethode, die in einer anderen Klasse implementiert ist

Ich versuche, die Methode getFailureDialog() des Interface OnSelectedListener aufzurufen. Die Methode ist in MainActivity.java implementiert. Aber wenn ich die Methode aufrufe, bekomme ich die Nullzeiger-Ausnahme.

Ich weiß, dass es daran liegt, dass OnSelectedListener noch nicht initialisiert ist und du getFailureDialog() auf ein nicht initialisiertes Objekt aufrufst. Offensichtlich werden Interface-Methoden nie initialisiert. Aber wie rufe ich dann die Methode getFailureDialog() von meiner Klasse Common.java aus auf?

Ich platziere unten nur den relevanten Quellcode-

Quellcode:

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

Fehlerprotokoll

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)

8voto

Kylar Punkte 8466
OnSelectedListener mCallback;

wird nie initialisiert oder mit einem Nullwert initialisiert.

public class Common
{
    OnSelectedListener mCallback = new OnSelectedListener(){
        public void getFailureDialog(){
            JOptionPane.showMessageDialog(null, "Es ist ein Fehler aufgetreten.");
        }
    };

    public interface OnSelectedListener 
    {
        public void getFailureDialog();
    }

    public void myRecord(String email)
    {
        mCallback.getFailureDialog();  //Jetzt funktioniert es.
    }
}

0voto

Droidman Punkte 11205

hier ist der Quellcode für den OnSelectedListener. Da es sich um eine Schnittstelle handelt, müssen Sie sie mit new initialisieren und die Methode onSelected() überschreiben ODER Ihre Klasse implementieren diesen Listener

0voto

Naveen Punkte 1693

Füge eine Methode hinzu 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
    }
}

Jetzt verwende setOnSelectedListener(), um deinen Listener zu initialisieren

Aber basierend auf deinem Code, musst du auch einen anderen Listener in deinem SharedFragment implementieren.

0voto

Dion Dirza Punkte 2577

Du musst deinen Code redesignen, Mann, lass die Klasse Common das Interface OnSelectedListener implementieren. Trenne also OnSelectedListener als äußeres Interface und nicht als inneres Interface.

Ich werde es so coden.

public interface OnSelectedListener 
{
    public void getFailureDialog();
}

dann sollte die Klasse Common so aussehen

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

    public void myRecord(String email)
    {
        getFailureDialog();
        //mache noch etwas mehr als nur die vorhandene Methode aufrufen
    }
}

und dieser Code wird reibungslos laufen. Wenn du getFailureDialog in der MainActivity implementieren musst, mache diese Common-Klasse zu einer abstrakten Klasse.

Die Common-Klasse wird so aussehen

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

    public void myRecord(String email)
    {
        getFailureDialog();
        //mache noch etwas mehr als nur die vorhandene Methode aufrufen
    }
}

jetzt kann deine MainActivity-Klasse von dieser Klasse erweitert werden, um den fehlenden Teil zu implementieren.

0voto

MoleIsKing Punkte 111

Sie müssen Common und MainActivity ändern. Fügen Sie in Common einen einfachen Konstruktor hinzu. Aktivieren Sie dann den Rückruf wie in startMyCallback gezeigt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X