1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】java.lang.NullPointerException: nullオブジェクトの参照に対して仮想メソッドを呼び出そうとした [重複] java.lang.NullPointerException: Attempt to invoke virtual method on a null object reference.

2022-01-12 10:18:04

質問

プレイヤーの名前を共有環境設定に保存し、それを別のアクティビティで表示させようとしているのですが、アプリがクラッシュします。

コードは以下の通りです。

コード

プレイヤー.java

public class Player {

private Context context;
private SharedPreferences prefSettingsU;
private SharedPreferences.Editor prefEditorU;
private static final int PREFERENCE_MODE_PRIVATE = 0;
private static final String MY_UNIQUE_PREF_FILE = "DrawItApp";

public Player(Context context, String name) {
    this.context = context;
    saveName(name);
}

public void saveName(String n) {
    prefSettingsU = context.getSharedPreferences(MY_UNIQUE_PREF_FILE, PREFERENCE_MODE_PRIVATE);
    prefEditorU = prefSettingsU.edit();
    prefEditorU.putString("keyName", n);
    prefEditorU.commit();
}

public String getName(Context ctx) {
    prefSettingsU = ctx.getSharedPreferences(MY_UNIQUE_PREF_FILE, PREFERENCE_MODE_PRIVATE);
    String name = prefSettingsU.getString("keyName", "ANONYMOUS");
    return name;
}

PlayGame.java

public class PlayGame extends Activity {

private TextView welcomePlayer;
private ListView createdGames;
private Player mPlayer;

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

    welcomePlayer = (TextView) findViewById (R.id.tvPlayerName);
    welcomePlayer.setText("Welcome Back, " + String.valueOf(mPlayer.getName(this)) + " !");

    createdGames = (ListView) findViewById (R.id.listCreatedGames);
    // adapter etc
    createdGames.setEmptyView(findViewById (R.id.tvNoGames));


}

PlayerName.java

public class PlayerName extends Activity {

private EditText playerName;
private Player mPlayer;
public static Context context;

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

}

public void onC_Confirm(View btnclick) {
    mPlayer = new Player(context, String.valueOf(playerName.getText()));
    //mPlayer.saveName();
    Intent intent = new Intent(PlayerName.this, PlayGame.class);
    startActivity(intent);
}

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

実行すると、エラーが発生します。

 Process: plp.cs4b.thesis.drawitapp, PID: 1970
 java.lang.RuntimeException: Unable to start activity ComponentInfo{plp.cs4b.thesis.drawitapp/plp.cs4b.thesis.drawitapp.PlayGame}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String plp.cs4b.thesis.drawitapp.Player.getName()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String plp.cs4b.thesis.drawitapp.Player.getName()' on a null object reference
    at plp.cs4b.thesis.drawitapp.PlayGame.onCreate(PlayGame.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

解決方法は?

アプリがクラッシュします。

welcomePlayer.setText("Welcome Back, " + String.valueOf(mPlayer.getName(this)) + " !");

なぜなら mPlayer=null .

を初期化するのを忘れています。 Player mPlayer をPlayGameアクティビティに追加してください。

mPlayer = new Player(context,"");