Java: 在Flash Card Game中点击JButton时抛出NullPointerException
Java: NullPointerException thrown when JButton is clicked in the Flash Card Game
详情:这是一款闪卡游戏,每张卡都有问答。
QuizCard 是 Cards 中的 class,具有 getQuestion()、getAnswer()、setQuestion()、setAnswer() 和两个字符串实例作为问题和答案等功能。参数化构造函数采用两个字符串,第一个作为问题,第二个作为答案。
我将问题和答案保存在一个文本文件中,其中问题和答案由“/”分隔。所有新问题都从一个新行开始。
例如。 -> 印度的首都是哪里?/新德里
泰姬陵在哪里?/Agra
其余代码很容易理解。
问题:单击 "nextButton" 时会抛出 NullPointerException,并且不会更改 "nextButton" 上的文本。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class QuizCardPlayer
{
private JFrame frame;
private JTextArea display;
private boolean isAnswer = true;
private JButton nextButton;
private ArrayList<QuizCard> cardList;
private int currentCardIndex;
public static void main(String[] args)
{
QuizCardPlayer player = new QuizCardPlayer();
player.go();
}
public void go()
{
frame = new JFrame("Quiz Card Player");
display = new JTextArea(6,20);
JPanel mainPanel = new JPanel();
Font bigFont = new Font("serif", Font.BOLD, 24);
display.setFont(bigFont);
JScrollPane scroller = new JScrollPane(display);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
display.setText("Lets Start!");
JButton nextButton = new JButton("Show Question");
mainPanel.add(scroller);
mainPanel.add(nextButton);
nextButton.addActionListener(new NextButtonListener());
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem loadMenuItem = new JMenuItem("Load card set");
loadMenuItem.addActionListener(new LoadMenuListener());
fileMenu.add(loadMenuItem);
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setVisible(true);
frame.setSize(300,300);
}
public class NextButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
System.out.print("Called!!");
if(isAnswer)
{
nextButton.setText("Show Answer");
if( currentCardIndex < cardList.size() )
{
display.setText(cardList.get(currentCardIndex).getQuestion());
isAnswer = false;
}
else
{
display.setText("That was last Card.");
nextButton.setEnabled(false);
}
}
else
{
nextButton.setText("Next Card");
display.setText(cardList.get(currentCardIndex).getAnswer());
isAnswer = true;
currentCardIndex++;
}
}
}
public class LoadMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
JFileChooser openFile = new JFileChooser();
openFile.showOpenDialog(frame);
loadFile(openFile.getSelectedFile());
}
}
public void loadFile(File loadFile)
{
try
{
BufferedReader reader = new BufferedReader(new FileReader(loadFile));
String line="";
cardList = new ArrayList<QuizCard>();
while( (line = reader.readLine()) != null )
{
String[] result = line.split("/");
QuizCard card = new QuizCard(result[0] , result[1]);
cardList.add(card);
currentCardIndex=0;
}
reader.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
我是Java新手,才一个月的经验,欢迎大家指教。
您正在创建 nextButton
作为 class QuizCardPlayer
的实例变量,但是在 go()
方法中,您初始化局部变量 nextButton
并添加Listener
到这个本地副本,并将 nextButton
的这个本地副本添加到 mainPanel
(在 VIEW 上可见)。
尽管实例变量仍然是 null
,因为您从未将它分配给任何东西,并且您试图在 NextButtonListener
class 中访问此 null
变量,因为如下:
nextButton.setText("Show Answer");
编辑 1:
只需将 go ()
方法中的这一行替换为:
JButton nextButton = new JButton("Show Question");
到
nextButton = new JButton("Show Question");
这会起作用:-)
详情:这是一款闪卡游戏,每张卡都有问答。
QuizCard 是 Cards 中的 class,具有 getQuestion()、getAnswer()、setQuestion()、setAnswer() 和两个字符串实例作为问题和答案等功能。参数化构造函数采用两个字符串,第一个作为问题,第二个作为答案。
我将问题和答案保存在一个文本文件中,其中问题和答案由“/”分隔。所有新问题都从一个新行开始。
例如。 -> 印度的首都是哪里?/新德里
泰姬陵在哪里?/Agra
其余代码很容易理解。
问题:单击 "nextButton" 时会抛出 NullPointerException,并且不会更改 "nextButton" 上的文本。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class QuizCardPlayer
{
private JFrame frame;
private JTextArea display;
private boolean isAnswer = true;
private JButton nextButton;
private ArrayList<QuizCard> cardList;
private int currentCardIndex;
public static void main(String[] args)
{
QuizCardPlayer player = new QuizCardPlayer();
player.go();
}
public void go()
{
frame = new JFrame("Quiz Card Player");
display = new JTextArea(6,20);
JPanel mainPanel = new JPanel();
Font bigFont = new Font("serif", Font.BOLD, 24);
display.setFont(bigFont);
JScrollPane scroller = new JScrollPane(display);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
display.setText("Lets Start!");
JButton nextButton = new JButton("Show Question");
mainPanel.add(scroller);
mainPanel.add(nextButton);
nextButton.addActionListener(new NextButtonListener());
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem loadMenuItem = new JMenuItem("Load card set");
loadMenuItem.addActionListener(new LoadMenuListener());
fileMenu.add(loadMenuItem);
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setVisible(true);
frame.setSize(300,300);
}
public class NextButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
System.out.print("Called!!");
if(isAnswer)
{
nextButton.setText("Show Answer");
if( currentCardIndex < cardList.size() )
{
display.setText(cardList.get(currentCardIndex).getQuestion());
isAnswer = false;
}
else
{
display.setText("That was last Card.");
nextButton.setEnabled(false);
}
}
else
{
nextButton.setText("Next Card");
display.setText(cardList.get(currentCardIndex).getAnswer());
isAnswer = true;
currentCardIndex++;
}
}
}
public class LoadMenuListener implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
JFileChooser openFile = new JFileChooser();
openFile.showOpenDialog(frame);
loadFile(openFile.getSelectedFile());
}
}
public void loadFile(File loadFile)
{
try
{
BufferedReader reader = new BufferedReader(new FileReader(loadFile));
String line="";
cardList = new ArrayList<QuizCard>();
while( (line = reader.readLine()) != null )
{
String[] result = line.split("/");
QuizCard card = new QuizCard(result[0] , result[1]);
cardList.add(card);
currentCardIndex=0;
}
reader.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
我是Java新手,才一个月的经验,欢迎大家指教。
您正在创建 nextButton
作为 class QuizCardPlayer
的实例变量,但是在 go()
方法中,您初始化局部变量 nextButton
并添加Listener
到这个本地副本,并将 nextButton
的这个本地副本添加到 mainPanel
(在 VIEW 上可见)。
尽管实例变量仍然是 null
,因为您从未将它分配给任何东西,并且您试图在 NextButtonListener
class 中访问此 null
变量,因为如下:
nextButton.setText("Show Answer");
编辑 1:
只需将 go ()
方法中的这一行替换为:
JButton nextButton = new JButton("Show Question");
到
nextButton = new JButton("Show Question");
这会起作用:-)