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

Java作业求助:如何在FileWriter中整合isPrime方法实现素数写入?

嘿,我帮你梳理下代码里的问题,主要是几个关键细节没贴合作业要求,导致素数判断结果没法正常写入文件:

核心问题分析

1. isPrime 方法不符合需求

  • 作业明确要求返回布尔值,但你写的是void类型,而且方法内部直接打印结果,没法让main方法拿到判断值去写入文件。
  • 方法声明里的throws IOException完全没必要——素数判断逻辑和文件操作无关。
  • 没处理num <= 1的特殊情况(小于2的数都不是素数),循环范围也可以优化成到sqrt(num),比num/2更高效。

2. main 方法里的逻辑错误

  • 重复创建了FileWriter和PrintWriter,属于冗余操作。
  • 读取输入文件的行后,直接调用inputFile.nextLine().isPrime()是完全错误的:String类根本没有这个方法,你得先把字符串转成int类型,再传给isPrime。
  • 写入文件的逻辑不对,你需要把数字和判断结果组合成可读的字符串,而不是直接写入布尔值(而且原代码的调用方式本身就会编译报错)。

修正后的完整代码

import java.io.*;
import java.util.Scanner;

public class PrimeChecker {
    public static void main(String[] args) throws IOException {
        Scanner keyboard = new Scanner(System.in);
        
        System.out.println("What is the name of the input file?");
        String inputFileName = keyboard.nextLine();
        File inputFile = new File(inputFileName);
        
        System.out.println("What is the name of the output file?");
        String outputFileName = keyboard.nextLine();
        
        // 用try-with-resources自动管理资源,避免手动关闭遗漏或异常时未关闭的问题
        try (Scanner fileScanner = new Scanner(inputFile);
             PrintWriter printWriter = new PrintWriter(new FileWriter(outputFileName))) {
            
            while (fileScanner.hasNextLine()) {
                String line = fileScanner.nextLine().trim();
                // 跳过空行(可选,让程序更健壮)
                if (line.isEmpty()) {
                    continue;
                }
                try {
                    int num = Integer.parseInt(line);
                    boolean primeResult = isPrime(num);
                    // 组合成清晰的结果字符串写入文件
                    printWriter.println(num + " is " + (primeResult ? "" : "not ") + "a prime number");
                } catch (NumberFormatException e) {
                    // 处理输入文件中非数字的行(可选,避免程序崩溃)
                    printWriter.println("Invalid input: " + line);
                }
            }
        }
        keyboard.close();
    }

    // 符合作业要求:接收int,返回布尔值的素数判断方法
    public static boolean isPrime(int num) {
        // 处理小于2的特殊情况
        if (num <= 1) {
            return false;
        }
        // 优化循环范围:判断到sqrt(num)即可
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

关键修改说明

  1. 重构isPrime方法:改成返回boolean类型,去掉冗余的异常声明,补充特殊值判断,优化循环效率。
  2. 修复类型转换:把输入文件的字符串行转成int后,再传给isPrime方法。
  3. 优化资源管理:用try-with-resources自动关闭文件流,比手动close更安全规范。
  4. 调整写入逻辑:把数字和判断结果组合成友好的字符串(比如"7 is a prime number")写入输出文件,符合作业要求。

内容的提问来源于stack exchange,提问作者Nitro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:54:15