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

Java读取文本文件生成int数组全为0问题排查求助

问题原因分析

嘿,你的代码问题其实很典型——第一个while循环把文件内容全读完了,导致第二个循环根本没东西可读!

具体来说:

  • 你第一个循环while (scanner.hasNextLine())的作用是统计文件行数,但每次循环里都调用了scanner.nextLine(),这会让Scanner的读取指针一步步走到文件末尾。
  • 当你进入第二个循环while(scanner.hasNextInt())时,Scanner已经没有剩余内容了,所以这个循环一次都不会执行。而int数组初始化时,所有元素默认值都是0,这就是为什么你输出全是0的原因。
解决建议

这里给你两种可行的解决思路,按需选择:

思路1:重新创建Scanner(简单直接)

统计完行数后,关闭旧的Scanner,再新建一个指向同一个文件的Scanner,这样就能从文件开头重新读取数据:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class RadiationReader {
    public static void main (String[] args) throws FileNotFoundException {
        int radCtr = 0;
        Scanner scanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt"));
        
        // 统计行数
        while (scanner.hasNextLine()) {
            radCtr++;
            scanner.nextLine();
        }
        scanner.close(); // 关闭旧的Scanner,释放资源
        
        // 重新初始化Scanner,从文件开头读取
        Scanner newScanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt"));
        int [] radiation = new int [radCtr];
        int i = 0;
        while(newScanner.hasNextInt()){
            radiation[i++] = newScanner.nextInt();
        }
        newScanner.close();
        
        // 输出验证
        for (int y = 0; y < radiation.length; y++) {
            System.out.println(radiation[y]);
        }
        int max = getMax(radiation);
        System.out.println("Maximum Value is: "+max);
    }
    
    // 假设你的getMax方法是这样实现的
    private static int getMax(int[] arr) {
        int max = arr[0];
        for (int num : arr) {
            if (num > max) max = num;
        }
        return max;
    }
}

思路2:一次循环完成读取(更高效)

其实没必要先统计行数再读取,用ArrayList先临时存储所有整数,最后再转成int数组,这样只需要遍历文件一次,效率更高:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class RadiationReader {
    public static void main (String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("C:/Users/u23s57/Documents/4_22_18_radiation.txt"));
        List<Integer> radiationList = new ArrayList<>();
        
        // 一次循环读取所有整数
        while(scanner.hasNextInt()){
            radiationList.add(scanner.nextInt());
        }
        scanner.close();
        
        // 将ArrayList转成int数组
        int[] radiation = radiationList.stream().mapToInt(Integer::intValue).toArray();
        
        // 输出验证
        for (int num : radiation) {
            System.out.println(num);
        }
        int max = getMax(radiation);
        System.out.println("Maximum Value is: "+max);
    }
    
    private static int getMax(int[] arr) {
        int max = arr[0];
        for (int num : arr) {
            if (num > max) max = num;
        }
        return max;
    }
}
额外注意点
  • 别忘了处理FileNotFoundException:要么在main方法上声明throws FileNotFoundException,要么用try-catch包裹文件读取逻辑,否则代码编译会报错。
  • 使用完Scanner后一定要调用close(),避免文件资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:56:22