调用CorrectLogin()报Unhandled exception type IOException如何解决?
异常产生原因
- IOException是Java的受检异常,只要方法声明了
throws IOException,所有调用该方法的位置必须显式处理异常:要么用try-catch捕获处理,要么调用方也在方法声明上加throws把异常继续向上抛 - 你调用
CorrectLogin()的actionPerformed是SwingActionListener接口的重写方法,父接口的该方法没有声明抛出任何受检异常,重写方法不能抛出比父方法更多的受检异常,所以无法通过向上抛的方式处理,编译器就会报「未处理IOException类型异常」的错误
修复方案
有两种常用修复方式,推荐第二种更规范:
方案1:调用处捕获异常
保持CorrectLogin方法的原有声明不变,在actionPerformed里调用时加try-catch捕获处理:
public void actionPerformed(ActionEvent e) { if(e.getSource()==EnterLogin) { try { CorrectLogin(); } catch (IOException ex) { // 自定义异常处理逻辑,例如打印日志、弹窗提示用户 ex.printStackTrace(); javax.swing.JOptionPane.showMessageDialog(null, "账号文件读取失败,请检查accounts.txt是否存在"); } } }
方案2:优化CorrectLogin内部逻辑,自行处理异常(推荐)
原代码还存在IO流未手动关闭、读取行未做空判断的问题,直接在方法内部处理异常同时修复潜在问题,调用方无需再处理异常:
// 去掉throws IOException声明,异常内部消化 private void CorrectLogin() { String filename = "accounts.txt"; // try-with-resources语法会自动关闭实现了AutoCloseable接口的流,无需手动调用close try (FileReader fr1 = new FileReader(filename); BufferedReader br1 = new BufferedReader(fr1)) { String accounts[][] = new String[10][2]; for(int k=0 ; k<10; k++ ){ String line = br1.readLine(); // 读到文件末尾时line为null,提前退出循环避免空指针 if (line == null) { break; } String split [] = line.split(","); accounts [k][0] = split [0]; accounts [k][1] = split [1]; System.out.println(accounts[k][1]); } } catch (IOException e) { // 内部处理异常 e.printStackTrace(); javax.swing.JOptionPane.showMessageDialog(null, "账号文件读取错误:" + e.getMessage()); } }
内容的提问来源于stack exchange,提问作者JORJbrody
相关产品推荐
相关产品推荐

