Intento de invocar método virtual en un error de referencia de objeto nulo en Java

Sheeraz Gul 12 octubre 2023
Intento de invocar método virtual en un error de referencia de objeto nulo en Java

Este tutorial demuestra cómo resolver el error Intentar invocar el método virtual en una referencia de objeto nulo en Java.

el error Intento de invocar método virtual en una referencia de objeto nulo en Java

Mientras se trabaja en una aplicación de Android, puede ocurrir el error Intento de invocar el método virtual en una referencia de objeto nulo, un tipo de NullPointerException. Siempre que intentemos invocar un método usando un objeto nulo, arrojará este error.

Aquí hay un sistema basado en la plataforma Android, que arroja la excepción NullPointerException con la descripción intento de invocar el método virtual en una referencia de objeto nulo.

Este ejemplo tiene tres clases Java diferentes.

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

Nombre_del_jugador.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);
  }

Juego_Juego.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));
  }
}

Ejecutamos el sistema anterior en una plataforma Android, que generará un error causado por la excepción java.lang.NullPointerException: intento de invocar el método virtual.

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

El error ocurre en la siguiente línea de código en la clase Game_Play.java.

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

Este error ocurre porque el M_Player viene como Nulo. Después de todo, no está inicializado. Al inicializar, podemos resolver ese problema.

Ver la solución:

Juego_Juego.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));
  }
}

Entonces, cada vez que trabaje en un sistema como este, debe asegurarse de que un método no invoque ningún valor nulo; de lo contrario, lanzará esta excepción.

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

Artículo relacionado - Java Exception