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
相关产品推荐
相关产品推荐

