Java中FileNotFoundException异常处理:已捕获仍报错问题
问题分析与解决:FileNotFoundException has already been caught
嘿,我来帮你搞定这个编译错误!咱们先拆解下为啥会出现这个报错:
报错原因
Java的异常处理有个核心规则:子类异常必须放在父类异常前面捕获。你代码里的FileNotFoundException其实是IOException的子类,现在你先写了catch(IOException i),这个catch块会把所有IOException及其子类的异常全部接住,后面那个专门抓FileNotFoundException的catch块根本没机会执行。编译器一眼就看穿了这个逻辑漏洞,直接告诉你“这个异常已经被前面的父类异常捕获啦”。
解决方法
给你两个可行的方案,选哪个看你的实际需求:
方案一:调整catch块顺序(推荐)
把子类异常的catch块挪到父类前面,这样先处理特定的“文件找不到”异常,再处理其他IO相关的通用异常:
public class SNIDDb { private char delimiter; private String name; private BufferedReader br; public SNIDDb(String name, char delimiter) { this.name=name; this.delimiter=delimiter; try { FileReader fr= new FileReader(name); br= new BufferedReader(fr); } catch(FileNotFoundException fnfe) { System.out.print(fnfe.getMessage()); } catch(IOException i) { System.out.println(i.getMessage()); } } }
方案二:合并处理(如果不需要区分两种异常)
要是你不需要分别处理“文件找不到”和其他IO异常,直接保留父类异常的catch块就行,省得多写冗余代码:
public class SNIDDb { private char delimiter; private String name; private BufferedReader br; public SNIDDb(String name, char delimiter) { this.name=name; this.delimiter=delimiter; try { FileReader fr= new FileReader(name); br= new BufferedReader(fr); } catch(IOException i) { System.out.println(i.getMessage()); } } }
另外提个小建议:实际开发里尽量别只用System.out打印异常信息,用日志框架(比如SLF4J)记录会更规范,也方便后续排查问题哦~
内容的提问来源于stack exchange,提问作者Raniel Johnson
相关产品推荐
相关产品推荐

