登录GUI匹配失败时未弹出JOptionPane问题求助
问题分析与修复
你的代码存在三个核心问题,直接导致匹配失败时弹窗不显示,同时还存在数据读取错误和数组越界风险:
1. 文件读取逻辑混乱
你用两个BufferedReader同时读取同一个文件,cr.readLine()每次会消耗一行数据,紧接着调用br.readLine()又会读取下一行,这会导致numbs列表只存入文件的偶数行数据,用户名和密码的对应关系完全错位,根本无法完成正确匹配。
修复:只用一个BufferedReader读取所有行:
ArrayList<String> numbs = new ArrayList<String>(); String line; while ((line = br.readLine()) != null) { numbs.add(line); }
2. for循环边界错误
循环条件i<=numbs.size()会触发IndexOutOfBoundsException——列表索引范围是0到size-1,当i等于numbs.size()时,numbs.get(i)会直接报错。同时每次i+2,要确保i+1不会超出列表范围,正确条件应为i <= numbs.size() - 2。
3. 匹配失败的判断逻辑错误
你初始化determine=0,只有匹配成功时才会修改它的值。但匹配失败时determine仍为0,而判断弹窗的条件是determine==numbs.size(),这个条件几乎不可能成立,所以弹窗永远不会触发。
修复:将determine初始化为-1,匹配成功时设为非-1的值,最后判断determine==-1时弹出提示:
int determine = -1; // ... 匹配逻辑 ... if (determine == -1) { JOptionPane.showMessageDialog(this, "try again"); }
完整修复后的代码
int determine = -1; try { String p1; String p2; String password = PasswordEntered.getText(); String username = UsernameEntered.getText(); // 用try-with-resources自动关闭流,避免资源泄漏 try (FileReader reader = new FileReader("LoginPages.txt"); BufferedReader br = new BufferedReader(reader)) { ArrayList<String> numbs = new ArrayList<String>(); String line; while ((line = br.readLine()) != null) { numbs.add(line); } // 确保i和i+1都不越界 for (int i = 0; i <= numbs.size() - 2; i = i + 2) { p1 = numbs.get(i); p2 = numbs.get(i + 1); // 用Objects.equals避免空指针异常 if (Objects.equals(password, p2) && Objects.equals(username, p1)) { determine = i; MainGUI x = new MainGUI(); x.setVisible(true); dispose(); // 找到匹配后直接跳出循环,无需继续遍历 break; } } } if (determine == -1) { JOptionPane.showMessageDialog(this, "try again"); } } catch(IOException ex) { JOptionPane.showMessageDialog(this, "File Not Found"); }
内容的提问来源于stack exchange,提问作者Nave
相关产品推荐
相关产品推荐

