Versuch, eine virtuelle Methode bei einem Nullobjekt-Referenzfehler in Java aufzurufen

Sheeraz Gul 12 Oktober 2023
Versuch, eine virtuelle Methode bei einem Nullobjekt-Referenzfehler in Java aufzurufen

Dieses Tutorial zeigt, wie Sie den Fehler Versuch, eine virtuelle Methode für eine Nullobjektreferenz aufzurufen in Java beheben.

der Fehler Versuch, eine virtuelle Methode für eine Nullobjektreferenz aufzurufen in Java

Beim Arbeiten an einer Android-Anwendung kann der Fehler Versuch, eine virtuelle Methode auf einer Nullobjektreferenz aufzurufen auftreten, eine Art NullPointerException. Immer wenn wir versuchen, eine Methode mit einem Nullobjekt aufzurufen, wird dieser Fehler ausgegeben.

Hier ist ein auf der Android-Plattform basierendes System, das die NullPointerException mit der Beschreibung Versuch, virtuelle Methode auf eine Nullobjektreferenz aufzurufen wirft.

Dieses Beispiel hat drei verschiedene Java-Klassen.

Main_Player.java:

package delftstack;

import javax.naming.Context;

public class Main_Player {
  private Context AppContext;
  private SharedPreferences SharedPreferencesSettingsU;
  private SharedPreferences.Editor PreferencesEditorU;
  private static final int PREFERENCE_MODE = 0;
  private static final String UNIQUE_PREFERENCES_FILE = "DemoApp";

  public Player(Context AppContext, String Player_Name) {
    this.AppContext = AppContext;
    Save_Name(Player_Name);
  }

  public void Save_Name(String nValue) {
    SharedPreferencesSettingsU =
        AppContext.getSharedPreferences(UNIQUE_PREFERENCES_FILE, PREFERENCE_MODE);
    PreferencesEditorU = SharedPreferencesSettingsU.edit();
    PreferencesEditorU.putString("keyName", nValue);
    PreferencesEditorU.commit();
  }

  public String Get_Name(Context DemoContext) {
    SharedPreferencesSettingsU =
        DemoContext.getSharedPreferences(UNIQUE_PREFERENCES_FILE, PREFERENCE_MODE);
    String PlayerName = SharedPreferencesSettingsU.getString("keyName", "ANONYMOUS");
    return PlayerName;
  }
}

Spielername.java:

package delftstack;

import javax.naming.Context;

public class Player_Name extends Activity {
  private EditText Player_Name;
  private Player M_Player;
  public static Context AppContext;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player_name);
    AppContext = this;
    Player_Name = (EditText) findViewById(R.id.etName);
  }

  public void onC_Confirm(View btnclick) {
    M_Player = new Player(AppContext, String.valueOf(Player_Name.getText()));
    // M_Player.saveName();
    Intent intent = new Intent(Player_Name.this, Game_Play.class);
    startActivity(intent);
  }

  public void onC_testShPref(View btnclick) {
    Intent intent = new Intent(Player_Name.this, Game_Play.class);
    startActivity(intent);
  }

Game_Play.java:

public class Game_Play extends Activity {
  private TextView Welcome_Player;
  private ListView Games_Created;
  private Player M_Player;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.play_game);

    Welcome_Player = (TextView) findViewById(R.id.tvPlayer_Name);
    Welcome_Player.setText("Welcome Back Player, " + String.valueOf(M_Player.getName(this)) + " !");

    Games_Created = (ListView) findViewById(R.id.listCreatedGames);
    Games_Created.setEmptyView(findViewById(R.id.tvNoGames));
  }
}

Wir führen das obige System auf einer Android-Plattform aus, die einen Fehler auslöst, der durch die java.lang.NullPointerException: Attempt to invoke virtual method verursacht wird.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String plp.cs4b.thesis.drawitapp.Main_Player.getName()' on a null object reference
    at plp.cs4b.thesis.drawitapp.Game_Play.onCreate(Game_Play.java:20)
    at android.app.Activity.performCreate(Activity.java:5933)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
    ... 10 more

Der Fehler tritt in der folgenden Codezeile in der Klasse Game_Play.java auf.

Welcome_Player.setText("Welcome Back Player, " + String.valueOf(M_Player.getName(this)) + " !");

Dieser Fehler tritt auf, weil der M_Player als Null kommt. Schließlich ist es nicht initialisiert. Durch die Initialisierung können wir dieses Problem lösen.

Siehe die Lösung:

Game_Play.java:

package delftstack;

public class Game_Play extends Activity {
  private TextView Welcome_Player;
  private ListView Games_Created;
  // initialize the M_Player
  private Player M_Player = new Main_Player(AppContext, "");

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.play_game);

    Welcome_Player = (TextView) findViewById(R.id.tvPlayer_Name);
    Welcome_Player.setText("Welcome Back Player, " + String.valueOf(M_Player.getName(this)) + " !");

    Games_Created = (ListView) findViewById(R.id.listCreatedGames);
    Games_Created.setEmptyView(findViewById(R.id.tvNoGames));
  }
}

Wenn Sie also an einem System wie diesem arbeiten, müssen Sie sicherstellen, dass eine Methode keinen null-Wert aufruft; Andernfalls wird diese Ausnahme ausgelöst.

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Verwandter Artikel - Java Exception