【问题标题】:Array in Method Header: error ']' expected (Java)方法标头中的数组:预期错误“]”(Java)
【发布时间】:2014-05-14 22:20:18
【问题描述】:

我对数组和方法还很陌生,而且我已经通过几个程序看到这个错误反复出现:error '[' expected.

在每种情况下,它似乎都会在我调整其他东西时自行纠正,但在这种特殊情况下,我完全被难住了。

顺便说一句,我正在使用几种方法和数组来创建一个测验(在你问之前,是的,这是一个作业,我同意,一个列表是处理这些数据的更好方法 - 但这不是一个选项)。

我可能没有在方法之间正确传递数组,因为我在这个过程中有点糊涂。据我了解,为了在方法之间发送/接收(即导入/导出)数组或其他变量,我必须在方法头参数中声明该变量/数组。

import java.util.Scanner;

public class H7pseudo
{

  public static void main(String[] args)
  {
    //call getAnswerkey method
    getAnswerkey(answerkey[i]);

    //call getAnswers method
    getAnswers(answers[i]);

    //call passed method? necessary or no?
    boolean passed = passed(answerkey[i], answers[i], qMissed[i], points);

    //Print results of grading
    if (passed)
    {
      System.out.println("Congratulations! You passed.");
    }
    else
    {
     System.out.println("Try again, sucka. You FAILED.");
    }

    //call totalPoints
    totalIncorrect(points);

    //call questionsMissed
    questionsMissed(qMissed[i]);
  }

  //get answer key (create answerkey array & export)
  public static void getAnswerkey(answerkey[i])
  {
    //create answerkey array here
    char[] answerkey;

    //determine number of questions (indices)
    answerkey = new char[20];

    //input values (correct answers) for each index
    //for our purposes today, the answer is always 'c'.
    for (int i = 0; i <=20; i++)
    {
      answerkey[i] = 'c';
    }
  }

  //get student answers (create answers array & export)
  public static void getAnswers(answers[i])
  {
    //initialize scanner for user input
    Scanner scan = new Scanner(System.in);

    //create answer array here
    char[] answers;

    //determine number of questions (indices)
    answers = new char[20];

    //prompt for user input as values of each index
    for (int i = 0; i <= 20; i++) {
      answers[i] = scan.nextChar();
    }
  }

  //grade student answers (import & compare index values of arrays:answers&answerkey
  //create & export qMissed array
  public static boolean passed(answerkey[i], answers[i], qMissed[i], points)
  {
     int points = 0;

     //create new array: qMissed
     boolean[] qMissed;

     //determine number of questions to be graded
     qMissed = new boolean[20];

     //initialize values for array
     for (int i = 0; i <= 20; i++) {
       qMissed[i] = false;
     }

     //cycle through indices of answerkey[i] & answers[i];
     for (int i = 0; i =< 20; i++)
     {
       if (answers[i] == answerkey[i])
       {
         correct = true;
         points = points+1;
         qMissed[i] = true;
       }
       else {
         qMissed[i] = false;
       }
     }

     //evaluate whether or not the student passed (15+ correct answers)
     if (points >= 15)
     {
       passed = true;
     }
     else
     {
       passed = false;
     }
     return passed;
   }

  public static void totalIncorrect(points)
  {
    int missed = 20 - points;
    System.out.println("You missed " + missed + " questions.");
  }


  public static void questionsMissed(qMissed[i])
  {
    // for each index of the array qMissed...
    for (int i = 0; i < qMissed.length; i++)
    {
      //...print correct and false answers.
      system.out.println(i + ": " + qMissed[i] + "\n");
    }
  }


}

【问题讨论】:

  • 你觉得public static void getAnswerkey(answerkey[i])应该怎么做?
  • 您可能需要考虑循环进行初始化,而不是那些大量的初始化块......
  • @Sotirios Delimanolis:这个想法是 getAnswerkey 建立一个数组来保存每个索引(问题)的正确值(答案)。我把它放在一种保持事物有条理和整洁的方法中。另外,在我缺乏经验的情况下,我对在“公共主”中的方法之间放置一个我想共享的数组有点怀疑......
  • @user3580294 天哪,你让我脸红了。我不敢相信我错过了! :-\ 感谢您的明智建议!
  • 我不是这个意思。我的意思是声明本身。解构每个部分。 public 是什么? static 是什么? void 是什么?括号之间的answerkey[i] 是什么?你如何定义一个方法?涉及哪些部分?

标签: java arrays methods compiler-errors


【解决方案1】:

您不能在 Java 中的方法签名中定义数组大小。

【讨论】:

    【解决方案2】:
    public static void getAnswerkey(answerkey[i])
    

    您不能在方法声明中的[] 中添加任何内容。另外,你必须提到类型:

    public static void getAnswerKey(char[] answerkey)
    

    这不是您的代码无法按预期工作的唯一原因,但我会将其余部分留作练习的一部分。

    【讨论】:

      【解决方案3】:

      查看您的方法定义:

      public static void questionsMissed(qMissed[i])
      

      这是错误的。您应该定义变量的类型,并且它不应该像数组元素那样包含[i]。应该是这样的:

      public static void questionsMissed(int qMissed)
      

      或者如果要传递数组,可以这样写:

      public static void questionsMissed(int[] qMissed)
      

      除此之外,您的代码中还有其他几个错误:

      getAnswerkey(answerkey[i]); //answerkey is not defined
      
      getAnswers(answers[i]); //answers is not defined
      

      如果你先开始阅读 Java 教程会更好。

      【讨论】:

      • @AntonH 不,因为它使用数组的单个元素,而不是数组。
      • @AntonH 好的,我阅读了其他方法并感到困惑。事实上,IMO 没有一个答案可以在 5 分钟之内写出来,可以解决 OP 代码中的所有问题,并给他一个关于如何用 Java 编程的教程。
      【解决方案4】:

      我想投票赞成 Luiggi 的回答,但我没有足够的声誉来做这件事:)

      恭喜cordivia,开始使用Java!

      以下是数组的声明方式:

      type[] arrayName = new type[numberOfElements]
      

      例如,您在 getAnswerkey() 的方法定义中就这样做了:

      char[] answerkey;
      answerkey = new char[20];
      

      方法定义中括号内的部分定义了该方法愿意从外部接受的数据的种类。因此,如果您不需要将某些内容放入方法中以从中获取某些内容,则无需在括号中放入任何内容。像这样定义方法:

      getAnswerkey() {
      

      ...但这还不是全部。如果你想从方法中get 一些东西,它也需要有一个返回类型return type 是当方法完成后你将从方法中得到的东西,这很神奇。例如,如果你想从一个方法中得到一个 int 数组,你可以这样做:

      public static int getTheInteger() {
      

      由于您需要方法中的 chars 数组,因此您需要执行以下操作:

      public static char[] getAnswerkey() {
      

      这就是你如何获得一种方法来回报你的东西。如果不想要任何东西,你把 void:

      public static void noMarshmallows() {
      

      现在,当您使用该方法时,您将需要利用它提供给您的东西做一些事情,或者它所做的所有工作都白费了。因此,当您 调用 数组时,您需要将 返回值 存储在一个变量中(调用 方法是您在 主要)。你知道如何在一个变量中存储一些东西。您使用“=”运算符:

      int myVeryFavoriteNumber;
      myVeryFavoriteNumber = 5;
      

      因此,当您从数组中获取某些内容时,您会执行相同的操作。您分配 返回值 给一个变量。如果您想对数组执行此操作,请执行以下操作:

      int[] myFavs;
      myFavs = getMyFavoriteNumbers();
      

      字符 相同:

      char[] answerKey;
      answerKey = getAnswerKey();
      

      瞧!您的答案键现已公开,可供 ma​​in 的其余部分查看:)

      现在,如果你想把一些东西放入一个方法并让它对你放入的东西做一些事情,你定义一个参数。你知道这是如何工作的。这就像声明一个变量,这正是它的本质。参数放在括号中,只有使用该参数的方法才能看到该变量名称(它是 local)。像这样的:

      public static void plusOneToAll (int[] numbers) {
          for (int i = 0; i < numbers.length; i++) {
              numbers[i] = numbers[i] + 1;
          }
      }
      

      注意括号中的 int[] 数字。传入的 typeint[] 或整数数组。 numbers 只是参数名称。它的功能就像一个变量,但它被声明为 locally(在括号内)并使用 locally(在方法内)。因此,如果您想比较两个数组的答案并返回匹配数(例如总分),您可以这样做:

      public static int getTotalScore (char[] correctAnswers, char[] userAnswers) {
      
          int totalScore = 0;
      
          for (int i = 0; i < correctAnswers.length; i++) {
              if (userAnswers[i] == correctAnswers[i]) {
                  totalScore = totalScore + 1;
              }
          }
      
          return totalScore;
      }
      

      注意返回类型:int(写在方法名之前)。 数组中,我使用变量 totalScore 来跟踪答案匹配的次数。 方法从外部获取两个字符数组并在内部使用它们。最后,我返回一个 inttotalScore。这会将 totalScore 的值重新设置为它的名称(ma​​in)。

      如果我可以补充最后一件事:帮自己一个忙,去拿一份Head First Java。很难在网上找到好的教程,Java 教科书也很无聊。 Head First 系列有点像成人涂色书。

      祝你好运!

      【讨论】:

      • 非常感谢您的全面回答。这是一个很好的解释1 我现在已经将问题缩减为一个错误!如果我可以征求您的意见,我不确定 SO 的最佳做法是什么:我应该更新这个线程上的代码吗?还是将其发布到新线程上?或者不要两次发布相同的程序(因为它不礼貌,或者只是蹩脚)?请坦率地说。再次感谢您!
      • 我对 Stack Overflow 还是很陌生,所以我不确定这方面的最佳做法是什么。但是,我确实知道这一点:在 Stack Overflow 上,将问题集中在一个问题上是一种很好的礼仪,所以如果你的最后一个错误不会被这个线程回答,最好在上面打开一个新线程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多