随机单词返回null

时间:2012-08-20 23:43:02

标签: java

当我将它作为标签“JLabel lblWord = new JLabel(randomWord)运行时,它不会显示标签但是当我作为system.out.println(randomWord)运行时它会给我null ...它假设返回一个文本文件中的单词,但即使我将整个代码移到底部

,它似乎也不起作用
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.List;

public final class Hangman extends JFrame
{
    static String randomWord;
    int i = 0;
    static JPanel panel;
    static JPanel panel2;
    static JPanel panel3;
    static JPanel panel4;

    public static String readWord()
    {
        try
        {
            BufferedReader reader = new BufferedReader(new FileReader("Words.txt"));
            String line = reader.readLine();
            List<String> words = new ArrayList<String>();
            while(line != null)
            {
                String[] wordsLine = line.split(" ");
                boolean addAll = words.addAll(Arrays.asList(wordsLine));
                line = reader.readLine();
            }
            Random rand = new Random(System.currentTimeMillis());
            String randomWord = words.get(rand.nextInt(words.size()));
        }catch (Exception e){

        }
        return randomWord;
    }

    public Hangman()
    {

        JButton[] buttons = new JButton[26];

        panel = new JPanel(new GridLayout(0,9));
        panel2 = new JPanel();
        panel3 = new JPanel();
        panel4 = new JPanel();

        JButton btnRestart = new JButton("Restart");
        btnRestart.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {

            }
        });

        JButton btnNewWord = new JButton("Add New Word");
        btnNewWord.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    FileWriter fw = new FileWriter("Words.txt", true);
                    PrintWriter pw = new PrintWriter(fw, true);

                    String word = JOptionPane.showInputDialog("Please enter a word: ");

                    pw.println(word);
                    pw.close();
                }
                catch(IOException ie)
                {
                    System.out.println("Error Thrown" + ie.getMessage());
                }
            }
        });

        JButton btnHelp = new JButton("Help");
        btnHelp.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e)
           {
               String message = "The word to guess is represented by a row of dashes, giving the number of letters and category of the word."
                       + "\nIf the guessing player suggests a letter which occurs in the word, the other player writes it in all its correct positions."
                       + "\nIf the suggested letter does not occur in the word, the other player draws one element of the hangman diagram as a tally mark."
                       + "\n"
                       + "\nThe game is over when:"
                       + "\nThe guessing player completes the word, or guesses the whole word correctly"
                       + "\nThe other player completes the diagram";
               JOptionPane.showMessageDialog(null,message, "Help",JOptionPane.INFORMATION_MESSAGE);
           }
        });

        JButton btnExit = new JButton("Exit");
        btnExit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

        ImageIcon icon = new ImageIcon("D:\\Varsity College\\Prog212Assign1_10-013803\\images\\Hangman1.jpg");
        JLabel lblWord = new JLabel(randomWord);
        JLabel label = new JLabel();
        label.setIcon(icon);
        String  b[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        for(i = 0; i < buttons.length; i++)
        {
            buttons[i] = new JButton(b[i]);

            panel.add(buttons[i]);
        }

        panel2.add(label);

        panel3.add(btnRestart);
        panel3.add(btnNewWord);
        panel3.add(btnHelp);
        panel3.add(btnExit);
        panel4.add(lblWord);
    }

    public static void main(String[] args) 
    {

        System.out.println();
        Hangman frame = new Hangman();
        Box mainPanel = Box.createVerticalBox();
        frame.setContentPane(mainPanel);
        mainPanel.add(panel, BorderLayout.NORTH);
        mainPanel.add(panel2);
        mainPanel.add(panel4);
        mainPanel.add(panel3);
        frame.pack();
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:3)

randomWord变量被声明两次,一次在Hangman类中,并且在那里保持为null,并且在readWord方法中第二次用随机String填充然后返​​回。请理解这些是两个不同且完全不同的变量。此外,在readWord()内声明的变量的范围仅限于此方法。换句话说,它在这种方法之外根本就不存在。

解决方案:

  • 摆脱Hangman类中的randomWord变量 - 它比没有价值更糟糕,因为它具有误导性。
  • 调用readWord()方法以在需要时获取随机单词。这就是你首先采用这种方法的原因。
  • 阅读变量范围和变量阴影,这是您遇到问题的两个概念。
  • 我会稍微改进一下并阅读一词将所有单词放入ArrayList<String>。然后,当我需要一个随机单词时,我会从ArrayList中随机获得一个单词。无需继续重读相同的文件。