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

Java如何打乱CSV读取的数组字符串字符并修复非静态方法调用报错

问题修复方案

错误原因

  • 报错的直接原因是你定义的shuffle()是实例方法,静态的main方法中直接调用方法名时,会默认尝试调用静态方法,就触发了静态上下文访问非静态方法的错误。
  • 额外问题:原shuffle()方法返回值为void,无法直接和英文单词拼接输出,且你已经实例化了Shuffle s = new Shuffle()但没有用到这个实例。
  • 代码缺失必要的包导入,运行时还会触发类找不到的错误。

修复后的完整代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Shuffle { 
    public static void main(String[] args) {
        String path = "/Users/SaberKlai/Documents/vokabeln.csv";
        String line = "";

        // 用try-with-resources自动管理流资源,避免资源泄露
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            Shuffle s = new Shuffle();
            while ((line = br.readLine()) != null) {
                String[] values = line.split(",");               
                // 用实例调用shuffle方法,拼接后输出
                System.out.println(values[0] + " " + s.shuffle(values[1]));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 修改返回值为String,将打乱后的字符串返回给调用方
    public String shuffle(String input){
        List<Character> characters = new ArrayList<>();
        for(char c:input.toCharArray()){
            characters.add(c);
        }
        StringBuilder output = new StringBuilder(input.length());
        while(!characters.isEmpty()){
            int randPicker = (int)(Math.random()*characters.size());
            output.append(characters.remove(randPicker));
        }
        return output.toString();
    }
}

修改点说明

  • 补充了java.io、java.util相关依赖包的导入声明
  • 将shuffle()方法的返回值从void调整为String,不再在方法内部直接打印结果,而是返回打乱后的字符串供调用方拼接使用
  • 调用shuffle()方法时通过已创建的实例s调用,解决静态上下文访问非静态方法的报错
  • 采用try-with-resources语法简化流资源管理,无需手动写关闭流的逻辑,避免资源泄露
  • 合并了异常捕获逻辑,简化代码结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:36:04