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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:34:39