このJavaコードで問題を見つけるのは難しいですが、見つけられません。スレッドグループをループする - デバッグの手助けをしてください
私が提供するコードで十分ですが、必要に応じてさらに投稿します。
さらにお詫び申し上げますが、私は最小限の例を作りませんでした。
java.lang.ThreadGroupの[名前=プレーヤー、MAXPRI = 10]
プレーヤー-0:113
プレーヤー-1:277
game.getGroupPlayers().list(); MoverThread[] playerThread = game.getPlayers(); System.out.println(playerThread.length); for (int i = 0; i < playerThread.length; i++) { try { System.out.println(i + " -> " +playerThread[i].toString()); returnString += playerThread[i].toString() + "\n"; } catch(NullPointerException e) { System.out.println("Problem at i = " + i); e.printStackTrace(); } game.getGroupPlayers().list(); }
は時々私に次のような出力を提供しますプレイヤー-2:0
0 - >プレイヤー-0:113
1 - >プレーヤー-1:277
問題Player.checkGoal(Player.java:61)でReferee.goalFound(Referee.java:70)
DebugTestReferee.goalFoundで (DebugTestReferee.java:42)
で、I = 2
java.lang.NullPointerExceptionが
で
Player.runで (Player.java:94)
java.lang.Thread.runで (Thread.java:636)
java.lang.ThreadGroupの[名前=プレーヤー、MAXPRI = 10]
Player- 0:113
Player-1:277
Player-2:0
[編集] ここgetPlayers()のソースだ
/*
* post returns the games players as an array
*/
public MoverThread[] getPlayers() {
synchronized(movers) {
MoverThread[] playerList = new MoverThread[players.activeCount()];
players.enumerate(playerList);
return playerList;
}
}
[編集] は、ここでは、プレイヤーが生成される方法です
private ThreadGroup movers;
private ThreadGroup players;
private ThreadGroup ghosts;
private Observer observer;
/*
* constructor
*/
public Game(Maze maze, Referee referee) {
this.maze = maze;
this.referee = referee;
threadList = new ArrayList<MoverThread>();
movers = new ThreadGroup("Movers");
players = new ThreadGroup(movers, "Players");
ghosts = new ThreadGroup(movers, "Ghosts");
observer = null;
}
[編集]
ここは、私が呼び出す方法です問題を生成する方法:
/*
* post checks if the players thread was interrupted - if not if hostfield pretends to be a goal the game gets stopped and referee is called to perform "goal-found-actions"
*/
private void checkGoal() {
if (!getThread().isInterrupted()) {
synchronized(getGame().getMovers()) {
if (!getThread().isInterrupted()) {
if (getHostField().isGoal()) {
Field goal = getHostField();
getGame().getReferee().goalFound(this, goal);
getGame().setGameOver();
}
}
}
}
}
、ここで全体goalFound('S)
/*
* post action to be performed if a player finds a goal
* print some information
*/
public void goalFound(Player player, Field at) {
//FIXME get the Bug!!!
String returnString = "Game over - player " + player.getName() + " found a goal on (" + at.getPos()[0] + ", " + at.getPos()[1] + ")!\n";
game.getGroupPlayers().list();
MoverThread[] playerThread = game.getPlayers();
System.out.println(playerThread.length);
for (int i = 0; i < playerThread.length; i++) {
try {
System.out.println(i + " -> " +playerThread[i].toString());
returnString += playerThread[i].toString() + "\n";
} catch(NullPointerException e) {
System.out.println("Problem at i = " + i);
e.printStackTrace();
}
}
game.getGroupPlayers().list();
returnString += game.mazeString();
System.out.println(returnString);
}
このループから呼び出されたコードでは例外がスローされません...他のスレッドのいずれかで例外が発生していることが表示され、ループの出力と同時に出力されているようです。 NPEが投げられているクラス 'Referee'ライン70を見てください。 –
Referee.java行70は です。System.out.println(i + " - >" + playerThread [i] .toString()); – speendo