使用toArray()后Object[]无法转为String[]的问题排查与解决咨询
兄弟,我帮你排查了下代码里的问题,咱们一步步拆解:
问题原因
你碰到的cant cast an object to a string错误,核心是两个问题导致的:
ArrayList转数组的方式错误
你用的list.toArray()无参方法,返回的是Object[]类型,Java里不允许直接把Object[]强制转换成String[]——这就像不能把“水果”直接当成“苹果”用,编译器不认这种跨类型强转。crows_word_game的words数组未初始化
看你的crows_word_game构造函数,words = new String[number];被注释掉了,这导致words是null。就算数组传对了,后续给c.words[i]赋值时,还会触发空指针异常。
另外还有个小坑:你的crows_word_game里的words、number都是static变量,所有实例会共享这些值,后续创建多个实例很容易出现数据混乱,建议改成非静态变量更合理。
解决方法
咱们分步骤修改代码:
1. 正确将ArrayList转为String数组
把读取文件里的list.toArray()改成带参数的toArray方法,直接返回String[],不用强转:
// 替换原来的list.toArray() String[] wordArray = list.toArray(new String[list.size()]); c.setWords(wordArray, c);
也可以用更简洁的写法:list.toArray(new String[0]),JVM会自动匹配数组大小。
2. 初始化crows_word_game的words数组
取消构造函数里的注释,确保words数组被正确初始化:
public crows_word_game(puzzle_diagram p,int wordsnum){ shape = p; number = wordsnum; words = new String[number]; // 取消注释,初始化数组 x=0; y=0; max=0; }
注意:调用这个构造函数时,要保证wordsnum和读取的文件行数一致,不然会出现数组越界或者赋值不全的问题。
3. 优化setWords方法(可选但推荐)
因为原来的words是静态变量,且方法里传了crows_word_game实例,其实可以简化成非静态变量和方法,避免静态变量的共享问题:
class crows_word_game { // 去掉static,改成实例变量 public puzzle_diagram shape; public int number; public String[] words; public int x,y,max; public boolean rock=false; public crows_word_game(){ } public crows_word_game(puzzle_diagram p,int wordsnum){ shape = p; number = wordsnum; words = new String[number]; x=0; y=0; max=0; } // 不用传c实例,直接操作当前对象的words public void setWords(String[] word) { // 加个判断避免数组长度不匹配 if(word.length != number){ throw new IllegalArgumentException("传入的数组长度和预期不符"); } // 可以用循环赋值,也可以用System.arraycopy更高效 System.arraycopy(word, 0, words, 0, number); } }
调用时也更简洁:
c.setWords(wordArray);
最终修改后的读取文件代码示例
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { File file = new File(jTextField1.getText()); // 创建实例时传入正确的puzzle_diagram和文件行数(先读取完列表再传更稳妥) ArrayList<String> list = new ArrayList<>(); try { Scanner fileIn = new Scanner(file); String line; while(fileIn.hasNextLine()) { line = fileIn.nextLine(); list.add(line); } // 转成String数组 String[] wordArray = list.toArray(new String[list.size()]); // 用读取到的行数初始化游戏实例 crows_word_game c = new crows_word_game(/* 你的puzzle_diagram实例 */, list.size()); c.setWords(wordArray); } catch (FileNotFoundException ex) { Logger.getLogger(readfile.class.getName()).log(Level.SEVERE, null, ex); } }
内容的提问来源于stack exchange,提问作者engineer it

