Java数组比较语法错误排查及代码优化咨询
Java数组索引使用错误与代码优化问题
我现在碰到个棘手的问题:在实现gradeExam和makeMissedArray这两个方法时,用索引j或g对比数组元素一直报编译错误,之前的方法都正常,就这俩方法里的if语句出问题了。编译报错信息如下:
DriverTest.java:72: error: ']' expected if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: ')' expected if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: ']' expected if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: ')' expected if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: not a statement if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: ';' expected if (char[j] answersUppercase != (char[j] answerKey){ ^ DriverTest.java:72: error: illegal start of expression if (char[j] answersUppercase != (char[j] answerKey){ ^
我的完整代码如下:
import java.util.Scanner; public static void main (String [] args){ Scanner input = new Scanner(System.in); String passedExam = null; char[] studentAnswers = new char[20]; char[] answerKey = {'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D'}; // make the string for the answers collectStudentAnswers(studentAnswers); //change the answers to uppercase answersUppercase(studentAnswers); //comapre the two strings with i=0 to 20 gradeExam(answerKey, studentAnswers); makeMissedArray(answerKey, studentAnswers); passedExam(gradeExam); System.out.printf("** Correct answers: %f", 20 - gradeExam); System.out.printf("** Incorrect answers: %f", gradeExam); System.out.printf("** %s", passedExam); System.out.printf("You missed the following questions:\n "); System.out.println(Array.toString(makeMissedArray)); } public static void collectStudentAnswers(char[] studentAnswers){ for (int i = 0; i < 20;){ System.out.printf("Question %d:\n ", i + 1); char[] studentAnswers = input.next().charAt(0); i++; } return studentAnswers; } public static char[] answersUppercase(char[] studentAnswers){ studentAnswers.toUpperCase(); return answersUppercase; } public static String passedExam (int gradeExam) { if (20 - gradeExam >= 15){ passedExam = "You passed the exam."; } else { passedExam = "You failed the exam!"; } return passedExam; } public static int gradeExam(char[] answerKey, char[] answersUppercase){ for (int j = 0; j < 20;){ if (char[j] answersUppercase != (char[j] answerKey){ gradeExam++; } } return gradeExam; j++; } public static int[] makeMissedArray(char[] answerKey, char[] answersUppercase){ for (int g = 0; g < 20;){ if (char[g] answersUppercase != (char[g] answerKey){ makemissedArray[j] = g; } g++; } }
问题剖析与修复方案
咱们一步一步拆解问题,把代码拉回正轨:
1. 核心语法错误:数组元素访问方式完全错了
这是导致编译报错的直接原因!你写的char[j] answersUppercase不符合Java语法,正确的数组元素访问格式是数组名[索引],比如answersUppercase[j]——数组本身就是char类型,不需要额外加char声明。
把错误的判断语句:
if (char[j] answersUppercase != (char[j] answerKey){
改成:
if (answersUppercase[j] != answerKey[j]) {
2. 循环结构逻辑错误
gradeExam方法里你把j++写在了循环外面,这会导致无限循环,必须把j++放到for循环的第三个表达式里,也就是:for (int j = 0; j < 20; j++){makeMissedArray方法的循环位置没问题,但内部逻辑需要调整(后面说)。
3. 方法参数与返回值的逻辑漏洞
collectStudentAnswers:不能直接用main方法的input,得把它作为参数传入;另外你重新声明了char[] studentAnswers,会覆盖方法参数,直接给传入的数组赋值就行,而且void方法不能返回值。answersUppercase:char数组没有toUpperCase()方法,得逐个字符调用Character.toUpperCase()转换。passedExam:不能直接用方法名当变量,得声明局部变量存储结果;main方法里调用它时,要先拿到gradeExam的返回值再传入。- main方法:打印正确/错误答案数要用
%d(整数格式),不是%f;调用makeMissedArray后要接收返回值,打印数组要用Arrays.toString()(注意是Arrays不是Array)。
4. makeMissedArray方法逻辑完善
原来的方法没正确创建和返回数组,建议用List收集错误的题目编号(注意题目是从1开始的,所以要把索引g加1),最后转成int数组返回。
修复后的完整代码
import java.util.Scanner; import java.util.Arrays; import java.util.ArrayList; import java.util.List; public class DriverTest { public static void main(String[] args) { Scanner input = new Scanner(System.in); String passedExamResult; char[] studentAnswers = new char[20]; char[] answerKey = {'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D'}; collectStudentAnswers(studentAnswers, input); answersUppercase(studentAnswers); int wrongCount = gradeExam(answerKey, studentAnswers); int[] missedQuestions = makeMissedArray(answerKey, studentAnswers); passedExamResult = passedExam(wrongCount); System.out.printf("** Correct answers: %d\n", 20 - wrongCount); System.out.printf("** Incorrect answers: %d\n", wrongCount); System.out.printf("** %s\n", passedExamResult); System.out.println("You missed the following questions:"); System.out.println(Arrays.toString(missedQuestions)); input.close(); } public static void collectStudentAnswers(char[] studentAnswers, Scanner input) { for (int i = 0; i < 20; i++) { System.out.printf("Question %d: ", i + 1); studentAnswers[i] = input.next().charAt(0); } } public static char[] answersUppercase(char[] studentAnswers) { for (int i = 0; i < studentAnswers.length; i++) { studentAnswers[i] = Character.toUpperCase(studentAnswers[i]); } return studentAnswers; } public static String passedExam(int wrongCount) { if (20 - wrongCount >= 15) { return "You passed the exam."; } else { return "You failed the exam!"; } } public static int gradeExam(char[] answerKey, char[] answersUppercase) { int wrongCount = 0; for (int j = 0; j < answerKey.length; j++) { if (answersUppercase[j] != answerKey[j]) { wrongCount++; } } return wrongCount; } public static int[] makeMissedArray(char[] answerKey, char[] answersUppercase) { List<Integer> missedList = new ArrayList<>(); for (int g = 0; g < answerKey.length; g++) { if (answersUppercase[g] != answerKey[g]) { missedList.add(g + 1); // 题目编号从1开始 } } int[] missedArray = new int[missedList.size()]; for (int i = 0; i < missedArray.length; i++) { missedArray[i] = missedList.get(i); } return missedArray; } }
内容的提问来源于stack exchange,提问作者Graduation
相关产品推荐
相关产品推荐

