2011-10-13 119 views
0

我花了大约2个小时试图了解为什么我的代码一直在抛出运行时错误。它不想接受用户输入...我很确定我的getext实现是正确的。你们可以看看我的代码,并帮我看看我做错了什么吗?Java getText NullPointerException

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.border.*; 

public class Mdt1 extends JFrame implements ActionListener{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
/** 
* @param args 
*/ 
JTextField twager, dcard1, dcard2, pcard1, pcard2; 

public Mdt1() { 
    JFrame blackjack = new JFrame(); 
    Border wwager = BorderFactory.createTitledBorder("Wager"); 
    JPanel pwager = new JPanel(); 
    pwager.setBorder(wwager); 
    JLabel lwager = new JLabel("Enter wager:"); 
    JTextField twager = new JTextField(6); 
    twager.addActionListener(this); 
    pwager.add(lwager); 
    pwager.add(twager); 

    JPanel pplayer = new JPanel(); 
    Border wayer = BorderFactory.createTitledBorder("Player"); 
    pplayer.setLayout(new BoxLayout(pplayer, BoxLayout.Y_AXIS)); 
    pplayer.setBorder(wayer); 
    pplayer.setSize(100, 100); 
    JTextField pcard1 = new JTextField(6); 
    pcard1.setEditable(false); 
    JTextField pcard2 = new JTextField(6); 
    pcard2.setEditable(false); 
    pplayer.add(pcard1); 
    pplayer.add(pcard2); 


    JPanel pdealer = new JPanel(); 
    Border wealer = BorderFactory.createTitledBorder("Dealer"); 
    pdealer.setLayout(new BoxLayout(pdealer, BoxLayout.Y_AXIS)); 
    pdealer.setBorder(wealer); 
    pdealer.setSize(100, 100); 
    JTextField dcard1 = new JTextField(6); 
    dcard1.setEditable(false); 
    JTextField dcard2 = new JTextField(6); 
    dcard2.setEditable(false); 
    pdealer.add(dcard1); 
    pdealer.add(dcard2); 

    JPanel cards = new JPanel(); 
    Border wards = BorderFactory.createTitledBorder("Cards"); 
    cards.setBorder(wards); 
    cards.setSize(220, 80); 
    cards.add(pplayer); 
    cards.add(pdealer); 

    JPanel pendgame = new JPanel(); 
    Border wesult = BorderFactory.createTitledBorder("Endgame"); 
    pendgame.setBorder(wesult); 



    blackjack.setLayout(new BorderLayout()); 
    blackjack.setVisible(true); 
    blackjack.setSize(200, 200); 
    blackjack.setTitle("♣ Blackjack ♠"); 
    blackjack.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    blackjack.add(pwager, BorderLayout.NORTH); 
    blackjack.add(cards); 
    blackjack.pack(); 
    blackjack.setResizable(false); 

} 

public void actionPerformed(ActionEvent e) { 
    String swager = twager.getText(); 
    double wager; 
    int dealer1, dealer2, player1, player2; 
    int dealervalue1, dealervalue2, playervalue1, playervalue2; 
    int dealerTotal, playerTotal; 


    wager = Double.parseDouble(swager); 

    Random r=new Random(); 
    // card faces 
    dealer1=r.nextInt(13) + 1; 
    String sdealer1 = Integer.toString(dealer1); 
    dealer2=r.nextInt(13) + 1; 
    String sdealer2 = Integer.toString(dealer2); 
    player1=r.nextInt(13) + 1; 
    String splayer1 = Integer.toString(player1); 
    player2=r.nextInt(13) + 1; 
    String splayer2 = Integer.toString(player2); 
    // Show dealer's card faces 
    switch(dealer1) 
    { 
    case 1: dcard1.setText("Ace "); break; 
    case 11: dcard1.setText("Jack"); break; 
    case 12: dcard1.setText("Queen"); break; 
    case 13: dcard1.setText("King"); break; 
    default: dcard1.setText(sdealer1); break; 
    } 
    switch(dealer2) 
    { 
    case 1: dcard2.setText("Ace"); break; 
    case 11: dcard2.setText("Jack"); break; 
    case 12: dcard2.setText("Queen"); break; 
    case 13: dcard2.setText("King"); break; 
    default: dcard2.setText(sdealer2); break; 
    } 
    // Show player's card faces 
    switch(player1) 
    { 
    case 1: System.out.print("Ace"); break; 
    case 11: System.out.print("Jack"); break; 
    case 12: System.out.print("Queen"); break; 
    case 13: System.out.print("King"); break; 
    default: System.out.print(splayer1); break; 
    } 
    switch(player2) 
    { 
    case 1: System.out.println("Ace"); break; 
    case 11: System.out.println("Jack"); break; 
    case 12: System.out.println("Queen"); break; 
    case 13: System.out.println("King"); break; 
    default: System.out.println(splayer2); break; 
    } 
    // Determine card values 
    dealervalue1 = dealer1; 
    switch(dealer1) 
    { 
    case 1: dealervalue1=11; break; 
    case 11: case 12: case 13: 
     dealervalue1=10; break; 
    } // switch 
    dealervalue2 = dealer2; 
    switch(dealer2) 
    { 
    case 1: dealervalue2=11; break; 
    case 11: case 12: case 13: 
     dealervalue2=10; break; 
    } // switch 
    dealerTotal = dealervalue1+dealervalue2; 
    if (dealerTotal == 22)  dealerTotal = 12; 
    playervalue1 = player1; 
    switch(player1) 
    { 
    case 1: playervalue1=11; break; 
    case 11: case 12: case 13: 
     playervalue1=10; break; 
    } // switch 
    playervalue2 = player2; 
    switch(player2) 
    { 
    case 1: playervalue2=11; break; 
    case 11: case 12: case 13: 
     playervalue2=10; break; 
    } // switch 
    playerTotal = playervalue1+playervalue2; 
    if (playerTotal == 22) 
     playerTotal = 12; 
    if (playerTotal == 21) 
    { 
     wager = wager * 1.5; 
     JOptionPane.showMessageDialog(null, "You have a Blackjack!!! \n You won: $" + wager); 

     return; 
    } 
    if (playerTotal >= dealerTotal) 
    { 
     System.out.println("" + wager); 
     return; 
    } 
    JOptionPane.showMessageDialog(null, "You lost: $" + wager, "You lost!", JOptionPane.ERROR_MESSAGE); 

    System.out.println(swager); 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    /** 
    * 2 
    * 2-card Blackjack game 
    */ 
    Mdt1 black = new Mdt1(); 
}// main 

} 

回答

4

你有实例字段 - JTextField twager, dcard1, dcard2, pcard1, pcard2;到局部引用变量的JTextField但在方法你存储Mdt1()引用。

public Mdt1() { 
    JFrame blackjack = new JFrame(); 
    Border wwager = BorderFactory.createTitledBorder("Wager"); 
    JPanel pwager = new JPanel(); 
    pwager.setBorder(wwager); 
    JLabel lwager = new JLabel("Enter wager:"); 
// JTextField twager = new JTextField(6); //<--- Local variable 
    twager = new JTextField(6);    //<--- correction 
    twager.addActionListener(this); 
    pwager.add(lwager); 
    pwager.add(twager); 
    .... 
} 
3

您与您的构造函数同名的另一个变量躲在你的类实例变量twager。实际上,你从来没有初始化你的类实例。

1

在你的构造函数,你重新声明,你必须为类变量的变量。

你的类变量的JTextField twager,dcard1,dcard2,pcard1,pcard2;

在构造函数称为Mdt1(),在那里你初始化这些变量,你在本地创建它们。

例如,线的JTextField twager =新的JTextField(6); 应改为twager =新的JTextField(6);如果你想修复这个问题。

这应该解决问题。