月落垟 2022-05-02 08:01 采纳率: 100%
浏览 122
已结题

第一次运行FileReader和BufferedReader提示找不到文件,再次执行命令后又可以找到了,如何解决?

问题遇到的现象和发生背景

使用Swing制作游戏,想用单选框控制文件路径后读取文件并显示游戏得分,完成后第一次点击单选框会提示找不到文件并清除单选框组的选择状态,第二次再次点击却又可以正确读取文件并显示得分了

问题相关代码
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.ArrayList;
import javax.swing.*;


public class ScoreFrame extends JFrame implements ItemListener {
    private static String[] filenames = {"text/m1paraiso.txt","text/m1terra.txt","text/m1inferno.txt",
            "text/m2paraiso.txt","text/m2terra.txt","text/m2inferno.txt"};

    public static File getFile() {
        return file;
    }

    private static File file;
    private JPanel jpNorth = new JPanel();
    private JLabel jl = new JLabel("História");
    private static JTextArea jta =new JTextArea(11,34);
    private JScrollPane jspCenter = new JScrollPane(jta);
    private ButtonGroup dificuldadeGrp = new ButtonGroup();
    private ButtonGroup mapGrp = new ButtonGroup();
    private JRadioButton r1,r2,r3,r4,r5;

    public ScoreFrame() throws IOException {
        int i;
        for (i=0;i<filenames.length;i++) {
            file = new File(filenames[i]);
            if(!file.exists()) { // 文本被删除后可以重新生成
                file.createNewFile();
            }
        }
        setLayout(new BorderLayout());

        r1 = new JRadioButton("Paraíso");
        r2 = new JRadioButton("Terra");
        r3 = new JRadioButton("Inferno");
        dificuldadeGrp.add(r1);
        dificuldadeGrp.add(r2);
        dificuldadeGrp.add(r3);
        r1.setSelected(true);
        jpNorth.add(r1);
        jpNorth.add(r2);
        jpNorth.add(r3);

        jpNorth.add(jl);
        jl.setFont(new Font("Arial",1,25));
        jpNorth.setLayout(new FlowLayout());

        r4 = new JRadioButton("Map 1");
        r5 = new JRadioButton("Map 2");
        mapGrp.add(r4);
        mapGrp.add(r5);
        r4.setSelected(true);
        jpNorth.add(r4);
        jpNorth.add(r5);

        r1.addItemListener(this);
        r2.addItemListener(this);
        r3.addItemListener(this);
        r4.addItemListener(this);
        r5.addItemListener(this);

        jta.setEditable(false);
        add(jpNorth,BorderLayout.NORTH);
        add(jspCenter,BorderLayout.CENTER);

        readFile();

        setSize(450, 300);
        setVisible(true);
        setResizable(false);
        setTitle("Score");
        this.setLocationRelativeTo(null);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                setVisible(false);
                jta.setText("");
            }
        });
    }
    
    // 按钮事件的监听,被按下后读取指定文件
    public void itemStateChanged(ItemEvent e){
        if (e.getSource()==r1) {
            try {
                readFile();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        } else if (e.getSource()==r2) {
            try {
                readFile();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        } else if (e.getSource()==r3) {
            try {
                readFile();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        } else if (e.getSource()==r4) {
            try {
                readFile();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        } else if (e.getSource()==r5) {
            try {
                readFile();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    // 读取文件的方法
    public void readFile() throws IOException {
        jta.setText("");
        file = new File(getFileName());
        FileReader fReader =new FileReader(getFileName());
        BufferedReader bReader =new BufferedReader(fReader);
        ArrayList<String> scoreList = new ArrayList<>();
        String string;
        while((string=bReader.readLine())!=null){
            scoreList.add(string);
        }
        for (int i = 0; i <scoreList.size(); i++) {
            jta.append(scoreList.get(i)+"\n");
        }
    }
    
    //根据单选框的选择从filenames里获取文件地址
    // r1,r2,r3和r4,r5分别是游戏难度和地图,通过这两组单选框的选项读取不同的文件来获得得分
    public String getFileName() {
        String f = "";
        if (r4.isSelected()) {
            if (r1.isSelected()) {
                f = filenames[0];
            } else if (r2.isSelected()) {
                f = filenames[1];
            } else if (r3.isSelected()) {
                f = filenames[2];
            }
        } else if (r5.isSelected()) {
            if (r1.isSelected()) {
                f = filenames[3];
            } else if (r2.isSelected()) {
                f = filenames[4];
            } else if (r3.isSelected()) {
                f = filenames[5];
            }
        }
        return f;
    }
}
运行结果及报错内容

只有当第二次点击同一个单选框后才可以正确显示文本内容,之后如果点击另一个单选框也要点击两次才可以,第一次报错并清空单选框状态,第二次正确读取文件

以下是报错内容

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.io.FileNotFoundException:  (绯荤粺鎵句笉鍒版寚瀹氱殑鏂囦欢銆�)
    at ScoreFrame.itemStateChanged(ScoreFrame.java:111)
    at java.desktop/javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:2000)
    at java.desktop/javax.swing.AbstractButton$Handler.itemStateChanged(AbstractButton.java:2320)
    at java.desktop/javax.swing.DefaultButtonModel.fireItemStateChanged(DefaultButtonModel.java:458)
    at java.desktop/javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:374)
    at java.desktop/javax.swing.ButtonGroup.setSelected(ButtonGroup.java:166)
    at java.desktop/javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:356)
    at java.desktop/javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:392)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6626)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389)
    at java.desktop/java.awt.Component.processEvent(Component.java:6391)
    at java.desktop/java.awt.Container.processEvent(Container.java:2266)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.io.FileNotFoundException:  (绯荤粺鎵句笉鍒版寚瀹氱殑鏂囦欢銆�)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
    at java.base/java.io.FileReader.<init>(FileReader.java:60)
    at ScoreFrame.readFile(ScoreFrame.java:125)   
    at ScoreFrame.itemStateChanged(ScoreFrame.java:109)
    ... 38 more

进程已结束,退出代码0

我的解答思路和尝试过的方法

一开始是在readFile()方法中的file = new File(getFileName());上报错,后来尝试过用File f = new File(getFileName())把它变成了file = new File(f); File和FileReaer是不报错了,但是BufferedReader又开始报错,也都是需要再次选择同一个单选框才可以读取文本,感觉这方法治标不治本也不知道BufferedReader这要怎么改。是不是我的读取方式有问题

我想要达到的结果

在单选框选择一次后就能正确找到并读取文件

  • 写回答

2条回答 默认 最新

  • 溪风沐雪 2022-05-02 08:52
    关注

    我估计问题在于你太多判断没有给默认值的问题,而且有些地方的代码有点冗余,我改了一下,你可以试试,我没有你的那些文件,没法测试

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.*;
    import java.util.ArrayList;
    import javax.swing.*;
     
     
    public class ScoreFrame extends JFrame implements ItemListener {
        private static String[] filenames = {"text/m1paraiso.txt","text/m1terra.txt","text/m1inferno.txt",
                "text/m2paraiso.txt","text/m2terra.txt","text/m2inferno.txt"};
     
        private JPanel jpNorth = new JPanel();
        private JLabel jl = new JLabel("História");
        private static JTextArea jta =new JTextArea(11,34);
        private JScrollPane jspCenter = new JScrollPane(jta);
        private ButtonGroup dificuldadeGrp = new ButtonGroup();
        private ButtonGroup mapGrp = new ButtonGroup();
        private JRadioButton r1,r2,r3,r4,r5;
     
        public ScoreFrame() throws IOException {
            for (int i=0;i<filenames.length;i++) {
                File file = new File(filenames[i]);
                if(!file.exists()) { // 文本被删除后可以重新生成
                    file.createNewFile();
                }
            }
            setLayout(new BorderLayout());
     
            r1 = new JRadioButton("Paraíso");
            r2 = new JRadioButton("Terra");
            r3 = new JRadioButton("Inferno");
            dificuldadeGrp.add(r1);
            dificuldadeGrp.add(r2);
            dificuldadeGrp.add(r3);
            r1.setSelected(true);
            jpNorth.add(r1);
            jpNorth.add(r2);
            jpNorth.add(r3);
     
            jpNorth.add(jl);
            jl.setFont(new Font("Arial",1,25));
            jpNorth.setLayout(new FlowLayout());
     
            r4 = new JRadioButton("Map 1");
            r5 = new JRadioButton("Map 2");
            mapGrp.add(r4);
            mapGrp.add(r5);
            r4.setSelected(true);
            jpNorth.add(r4);
            jpNorth.add(r5);
     
            r1.addItemListener(this);
            r2.addItemListener(this);
            r3.addItemListener(this);
            r4.addItemListener(this);
            r5.addItemListener(this);
     
            jta.setEditable(false);
            add(jpNorth,BorderLayout.NORTH);
            add(jspCenter,BorderLayout.CENTER);
     
            readFile();
     
            setSize(450, 300);
            setVisible(true);
            setResizable(false);
            setTitle("Score");
            this.setLocationRelativeTo(null);
            addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    setVisible(false);
                    jta.setText("");
                }
            });
        }
        
        // 按钮事件的监听,被按下后读取指定文件
        public void itemStateChanged(ItemEvent e){
            try {
                readFile();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
     
        // 读取文件的方法
        public void readFile() throws IOException {
            jta.setText("");
            FileReader fReader =new FileReader(getFileName());
            BufferedReader bReader =new BufferedReader(fReader);
            ArrayList<String> scoreList = new ArrayList<>();
            String string;
            while((string=bReader.readLine())!=null){
                scoreList.add(string);
            }
            for (int i = 0; i <scoreList.size(); i++) {
                jta.append(scoreList.get(i)+"\n");
            }
        }
        
        //根据单选框的选择从filenames里获取文件地址
        // r1,r2,r3和r4,r5分别是游戏难度和地图,通过这两组单选框的选项读取不同的文件来获得得分
        public String getFileName() {
            String f = "";
            if (r4.isSelected()) {
                if (r1.isSelected()) {
                    f = filenames[0];
                } else if (r2.isSelected()) {
                    f = filenames[1];
                } else {
                    f = filenames[2];
                }
            } else {
                if (r1.isSelected()) {
                    f = filenames[3];
                } else if (r2.isSelected()) {
                    f = filenames[4];
                } else {
                    f = filenames[5];
                }
            }
            return f;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月10日
  • 已采纳回答 5月2日
  • 赞助了问题酬金20元 5月2日
  • 创建了问题 5月2日

悬赏问题

  • ¥15 k8s生产配置推荐配置及部署方案
  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环
  • ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!