我试图在我的gui类中添加一个文本区域,其中包含来自另一个运行线程的控制器类的信息。
我对一般的线程感到有点困惑,并且对于为什么这不起作用感到困惑。
这是跟踪:
线程“Thread-1”中的异常java.lang.NullPointerException at blackjack.Server.DealerForm.appendDealerBox(DealerForm.java:86)at blackjack.Server.DealerController.shuffleDeck(DealerController.java:42) 在blackjack.Server.DealerController.run(DealerController.java:116) 在java.lang.Thread.run(Thread.java:745)
所以它不喜欢shuffleDeck中的append函数,但我不确定原因。
感谢您的帮助。
DealerForm.java
public class DealerForm extends javax.swing.JFrame {
public static boolean gameStarted;
public static boolean startGameButton = false;
/**
* Creates new form DealerForm
*/
public DealerForm()
{
setTitle("Dealer");
initComponents();
}
public static boolean getStartGame()
{
return startGameButton;
}
private void initDealer()
{
ServerSocket servsocket = null;
try
{
servsocket = new ServerSocket(7776);
}
catch(IOException ex)
{
DealerForm.appendDealerBox(ex.toString());
ex.printStackTrace();
}
gameStarted = false;
DealerController dealer = new DealerController();
new Thread(dealer).start();
while(gameStarted = false)
{
Socket socket = null;
try
{
socket = servsocket.accept();
}
catch(IOException ex)
{
DealerForm.appendDealerBox("Player Disconnected\n");
ex.printStackTrace();
}
PlayerController player = new PlayerController(socket, dealer);
dealer.addPlayer(player);
DealerForm.appendDealerBox("Player: " + player.toString() + "Connected \n");
}
}
public static void appendDealerBox(String message)
{
DealerTextArea.append(message);
}
public static void disableStartGameButton()
{
StartGameButton.setVisible(false);
}
public void enableStartGameButton()
{
StartGameButton.setVisible(true);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
DealerTextArea = new javax.swing.JTextArea();
playerCountLabel = new javax.swing.JLabel();
playerCount = new javax.swing.JLabel();
StartGameButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
DealerTextArea.setColumns(20);
DealerTextArea.setRows(5);
jScrollPane1.setViewportView(DealerTextArea);
playerCountLabel.setText("Player Count:");
playerCount.setText("0");
StartGameButton.setText("Start Game");
StartGameButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
StartGameButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(21, 21, 21)
.addComponent(playerCountLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(playerCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 395, Short.MAX_VALUE)
.addComponent(StartGameButton)
.addGap(66, 66, 66))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 288, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(playerCountLabel)
.addComponent(playerCount))
.addComponent(StartGameButton))
.addContainerGap(77, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void StartGameButtonActionPerformed(java.awt.event.ActionEvent evt) {
startGameButton=true;
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(DealerForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DealerForm().setVisible(true);
}
});
ServerSocket servsocket = null;
try
{
servsocket = new ServerSocket(7776);
}
catch(IOException ex)
{
DealerForm.appendDealerBox(ex.toString());
ex.printStackTrace();
}
gameStarted = false;
DealerController dealer = new DealerController();
new Thread(dealer).start();
while(gameStarted = false)
{
Socket socket = null;
try
{
socket = servsocket.accept();
}
catch(IOException ex)
{
DealerForm.appendDealerBox("Player Disconnected\n");
ex.printStackTrace();
}
PlayerController player = new PlayerController(socket, dealer);
dealer.addPlayer(player);
DealerForm.appendDealerBox("Player: " + player.toString() + "Connected \n");
}
}
// Variables declaration - do not modify
public static javax.swing.JTextArea DealerTextArea;
public static javax.swing.JButton StartGameButton;
private javax.swing.JScrollPane jScrollPane1;
public javax.swing.JLabel playerCount;
private javax.swing.JLabel playerCountLabel;
// End of variables declaration
DealerController.java
public class DealerController implements Runnable
{
Card card;
private ArrayList<Card> deck;
volatile ArrayList<PlayerController> players;
ArrayList<Integer> playerCardValues;
volatile Iterator<PlayerController> iterator;
String anyMessage = "";
public boolean startGame = false;
//Fills deck with each type of card from enum CardList four times to represent a 52 card deck
private void shuffleDeck()
{
deck = new ArrayList<Card>();
for(CardList thisCard:CardList.values())
{
card = new Card(thisCard);
deck.add(card);
card = new Card(thisCard);
deck.add(card);
card = new Card(thisCard);
deck.add(0, card);
card = new Card(thisCard);
deck.add(2, card);
}
DealerForm.appendDealerBox("Number of cards in current Deck:" + deck.size() + "\n");
}
//if less than 5 players, allows the player to join.
public void addPlayer(PlayerController player)
{
if(players.size() < 5)
{
players.add(player);
DealerForm.appendDealerBox("Player joined the game\n");
}
else
{
player.sendMessage("Sorry, too many players or game has already started\n");
}
}
//gives player random card
public Card dealCard()
{
Random random = new Random(System.currentTimeMillis());
int i = random.nextInt(deck.size());
card = deck.get(i);
deck.remove(i);
return card;
}
//Disconnects player
public void removePlayer(Iterator iterator)
{
DealerForm.appendDealerBox("Player disconnected\n");
iterator.remove();
}
@Override
public void run()
{
playerCardValues = new ArrayList<>();
players = new ArrayList<>();
while (true)
{
//DealerForm.appendDealerBox("Press Start to begin game! \n");
if (startGame = false)
{
System.out.println("I am inside IF Statement");
return;
}
else
{
System.out.println("Test entered Else");
for (PlayerController pl : players)
{
pl.sendMessage("START");
System.out.println("I sent start");
}
DealerForm.gameStarted = true;
iterator = players.iterator();
while (iterator.hasNext())
{
PlayerController pl = iterator.next();
pl.sendMessage("BET");
pl.setBet(iterator);
}
shuffleDeck();
iterator = players.iterator();
while (iterator.hasNext())
{
PlayerController pl = iterator.next();
pl.sendCard();
pl.sendCard();
}
iterator = players.iterator();
while (iterator.hasNext())
{
PlayerController pl = iterator.next();
pl.sendMessage("DECIDE");
pl.getDecision(iterator);
}
for (PlayerController pl : players)
{
if (pl.getPlayerCardValue() > 21)
{
pl.sendMessage("LOSE");
pl.sendPlayerCount(players.size());
}
else
{
playerCardValues.add(pl.getPlayerCardValue());
}
}
Collections.sort(playerCardValues);
for (PlayerController pl : players)
{
if (pl.getPlayerCardValue() == playerCardValues.get(playerCardValues.size() - 1))
{
pl.sendMessage("WIN");
pl.sendPlayerCount(players.size());
}
else
{
pl.sendMessage("LOSE");
pl.sendPlayerCount(players.size());
}
}
for (PlayerController pl:players)
{
pl.newGame();
}
DealerForm.gameStarted = false;
playerCardValues = new ArrayList<>();
}
}
}
}