如何在try-catch异常块中嵌入if语句?附文件读取代码求助
嘿,我帮你排查下这段代码里的问题!你遇到的异常和逻辑错误主要出在几个细节上,咱们一步步来修正:
1. 错误的对象类型比较
你写的 if(myList.equals(argument)) 是把File对象和字符串做相等判断,这俩类型完全不同,永远不会匹配,所以这个条件永远不会成立,每次都会走else分支。
你得根据实际需求调整判断逻辑:
- 如果
argument是文件名(比如"test.txt"),就用myList.getName().equals(argument) - 如果
argument是完整文件路径(比如"C:/files/test.txt"),就用myList.getAbsolutePath().equals(argument)
2. Scanner在循环内关闭导致的异常
你把 in.close() 放在了while循环内部,这会导致第一次循环结束就关闭Scanner,后续循环再调用in.hasNextLine()或者in.nextLine()时,就会抛出IllegalStateException,这也是代码报错的核心原因之一。
推荐用try-with-resources语法创建Scanner,JVM会自动帮你管理资源,不用手动写close,彻底避免这类问题。
3. 不合理的else分支输出
原来的else分支会在每次循环时都打印"do something",这大概率不是你想要的效果——应该是当文件不匹配时只提示一次,而不是循环输出。
修正后的完整代码
public static void reader(String file, String argument) { File myList = new File(file); // try-with-resources自动管理Scanner,无需手动close try (Scanner in = new Scanner(myList)) { // 提前判断文件是否匹配,避免循环内重复执行判断 boolean isFileMatch = myList.getName().equals(argument); while (in.hasNextLine()) { String s = in.nextLine(); if(isFileMatch){ System.out.println(s); // 合并print和println,简化代码 } } // 仅当文件不匹配时,在循环结束后提示一次 if(!isFileMatch){ System.out.println("do something"); } } catch (FileNotFoundException e) { e.printStackTrace(); } }
关键修改说明
- 用
try-with-resources替代手动关闭Scanner,避免资源泄漏和循环内关闭的异常 - 将文件匹配判断移到循环外,提升代码执行效率
- 修正了类型不匹配的比较逻辑,确保条件能正确触发
- 调整else分支的执行时机,避免重复输出无关内容
内容的提问来源于stack exchange,提问作者Ghoster
相关产品推荐
相关产品推荐

