将String数组改为ArrayList后程序报错,求解决方法
解决ArrayList替代数组后的代码错误
你遇到的所有错误都源于ArrayList与数组的API不兼容,以下是针对性的修正方案:
核心问题与修正点
- 数组转ArrayList:
line.split(" ")返回String[],不能直接赋值给ArrayList,必须通过Arrays.asList()转换后初始化ArrayList:tokens = new ArrayList<>(Arrays.asList(line.split(" "))); - 索引访问:数组用
tokens[i],ArrayList要调用get(i)方法:// 错误写法 tokens[0].equals("IF") // 正确写法 tokens.get(0).equals("IF") - 长度判断:数组的
length属性对应ArrayList的size()方法:// 错误写法 tokens.length == 3 // 正确写法 tokens.size() == 3 - 截取子集合:
Arrays.copyOfRange是数组专属方法,ArrayList用subList(),注意要转成新的ArrayList避免视图修改问题:// 错误写法 tokens = Arrays.copyOfRange(tokens, 5, tokens.length); // 正确写法 tokens = new ArrayList<>(tokens.subList(5, tokens.size())); - 方法参数适配:
evaluateExpression原接收String[],可以把ArrayList转成数组传入,或者修改方法参数为ArrayList<String>。
修正后的完整代码
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.io.BufferedReader; import java.io.FileReader; public class YourProgramClass { // 替换为你的实际类名 // 假设errors和result是类成员变量(需根据实际类型补充) private /* 对应组件类型 */ errors; private /* 对应组件类型 */ result; public void processProgram() { String fileName; String line; ArrayList<String> tokens = new ArrayList<>(); // 指定泛型String,避免类型问题 HashMap<String, Double> variables = new HashMap<>(); int lineNumber = 0; fileName = getFileName(); if(fileName == null) { errors.setText("Error: No file selected"); return; } try { BufferedReader reader = new BufferedReader(new FileReader(fileName)); while((line = reader.readLine()) != null) { lineNumber++; tokens = new ArrayList<>(Arrays.asList(line.split(" "))); // 修正GOTO判断逻辑(原代码直接用tokens.equals("GOTO")是错误的) if(tokens.get(0).equals("GOTO")) { lineNumber = Integer.parseInt(tokens.get(1)); } else if(tokens.get(0).equals("IF")) { double value = Double.parseDouble(tokens.get(3)); double checkValue = variables.get(tokens.get(1)); if(checkValue == value) { tokens = new ArrayList<>(tokens.subList(5, tokens.size())); double expressionValue = evaluateExpression(tokens.toArray(new String[0]), variables); variables.put(tokens.get(0), expressionValue); } } else if(tokens.size() == 3 && tokens.get(1).equals("=")) { double expressionValue = evaluateExpression(tokens.toArray(new String[0]), variables); variables.put(tokens.get(0), expressionValue); } else if(tokens.get(0).equals("PRINT")) { try { double printValue = variables.get(tokens.get(1)); result.append(String.format("%.2f", printValue) + "\n"); } catch (NullPointerException e) { errors.setText("Error: Line " + lineNumber + ": Variable not declared"); return; } } else if(tokens.get(0).equals("END")) { return; } else { errors.setText("Error: Line " + lineNumber + " is invalid"); return; } } reader.close(); } catch (Exception e) { e.printStackTrace(); } } // 保持原evaluateExpression方法不变,接收String[]参数 public double evaluateExpression(String[] tokens, HashMap<String, Double> variables) { double result = 0; for(int i = 0; i < tokens.length; i++) { if(i == 0) { result = Double.parseDouble(tokens[i]); } else if(tokens[i].equals("+")) { result += Double.parseDouble(tokens[i+1]); i++; } else if(tokens[i].equals("-")) { result -= Double.parseDouble(tokens[i+1]); i++; } else if(tokens[i].equals("*")) { result *= Double.parseDouble(tokens[i+1]); i++; } else if(tokens[i].equals("/")) { result /= Double.parseDouble(tokens[i+1]); i++; } else { try { result += variables.get(tokens[i]); } catch (NullPointerException e) { errors.setText("Error: Variable not declared"); return -1; } } } return result; } // 假设getFileName是已实现的方法 private String getFileName() { // 补充你的实现逻辑 return null; } }
额外提示
- 声明ArrayList时指定泛型
ArrayList<String>,可以避免后续强制类型转换的麻烦。 - 原代码中
if(tokens.equals("GOTO"))逻辑错误,已修正为判断第一个元素是否为GOTO。
内容的提问来源于stack exchange,提问作者Beau Moody
相关产品推荐
相关产品推荐

