You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:32:35