【问题标题】:Java - error: constructor "constructor name" in class "class name" cannot be applied to given types;Java - 错误:类“类名”中的构造函数“构造函数名”不能应用于给定类型;
【发布时间】:2015-07-14 22:36:30
【问题描述】:

在问我的问题之前,我想澄清一些事情。首先,我是 Java 和一般编程的新手。其次,这是我的第一篇文章,所以如果我做错了,请放轻松。最后,我希望在对这篇文章的任何回复中为我的任务提供任何具体的解决方案。这些问题是我要弄清楚的。我想要的是解释为什么我的测试代码不会编译/运行。为了更好地理解这个问题,我将粘贴分配信息,然后是给定的 Driver 类,然后是 Driver 类访问的我的类代码。我的编译器错误显示在标题中,但由于它相当模糊,here 是我得到的确切错误的屏幕截图。

以下是作业:

你要设计一个类“LostPuppy.java”,它代表一只小狗迷失在多层建筑中, 每层包含相同数量的房间。在此类对象的实例化(或创建)期间, 每个楼层的每个房间都将被初始化为空(您实际上将为此使用空格''字符 目的),并且将选择一个随机房间来放置小狗丢失的地方。为此,字符“P”将 被放置在这个随机位置。下面列出了有关构造函数的更多详细信息。

这个类的一个对象被用作两个玩家轮流寻找小狗的游戏,一个房间在一个 直到找到不幸的小犬。将执行此对象的实例化和搜索 通过提供给您的“驱动程序”程序,您只需专注于开发 类(驱动程序在“PuppyPlay.java”文件中)

字段(当然,所有字段都是私有的):

  • 名为 myHidingPlaces 的字符 (char) 数组。这表示行是楼层的建筑物 柱子是每一层的房间(这座建筑有一个不寻常的编号系统;楼层和 房间都从零开始)。

  • 两个整数将存放小狗丢失的地板和房间,名为 myFloorLocation 和 我的房间位置。

  • 一个名为 myWinner 的字符,当玩家找到小狗时,该字符将分配给玩家的角色 (驱动程序使用数字“1”和“2”来更清楚地区分玩家和小狗)。

  • 一个名为 myFound 的布尔值,在找到小狗时设置为 true。

构造函数:

  • 接收两个整数参数作为用户输入的建筑物的楼层数和房间数 小狗迷路了。

  • 构造函数将二维数组“myHidingPlaces”实例化为带有第一个参数的字符数组 用于行 (theFloors) 和第二个参数作为列 (theRooms)。

  • 初始化 myHidingPlaces 单元格,每个单元格都包含一个空格“”(用单引号完成)

  • 使用第一个参数随机设置 myFloorLocation(地板小狗开启)
  • 使用第二个参数随机设置 myRoomLocation(小狗所在的房间)
  • 将 myHidingPlaces[myFloorLocation][myRoomLocation] 设置为字符“P”
  • 将 myWinner 设置为单个空格
  • 将 myFound 设置为 false

方法:

  • roomSearchedAlready 接收要搜索的楼层和房间,如果房间有,则返回 true 已经被搜索过,否则为假。

  • puppyLocation 接收要搜索的楼层和房间,如果楼层和房间是则返回 true 小狗丢失的地方,否则为假。此方法不应更改任何字段。

  • indicesOK 接收要搜索的楼层和房间,如果楼层和房间的值是 在数组索引范围内,否则为 false(用于检查这些索引是否不会导致错误 应用于数组时)。

  • numberOfFloors 返回建筑物的楼层数(一楼从零开始)。

  • numberOfRooms 返回建筑物每层的房间数(第一个房间从 零且所有楼层的房间数相同)。

  • searchRoom 接收要搜索的楼层和房间以及当前玩家(作为字符类型) 如果找到小狗,则返回 true,否则返回 false。如果没有找到小狗 searchRoom 也 将接收到的楼层和房间位置的 myHidingPlaces 数组设置为接收到的玩家值(“1” 或“2”)或者,当找到时,将 myWinner 字段设置为当前玩家并将 myFound 设置为 true。

  • toString 显示当前的hidingPlaces 数组及其内容,除了小狗的位置 在找到他/她之前一直隐藏,此时(由驱动程序)将调用 toString 并且两者 找到小狗的玩家和一个“P”将显示在同一个单元格中……

  • 现在,也许是 toString 输出的尴尬部分。通常,在显示二维数组时, [0][0] 单元格与矩阵一样显示在左上角。然而,因为小狗 决定迷失在建筑物而不是矩阵中,拥有一楼会更具视觉意义 (第 0 行)显示在底部,在它上面的二楼……最后是顶层,嗯……在顶部!到 保存文字,请仔细查看下一页提供的示例运行。你的输出应该看起来 与在示例运行的下一页上看到的相同。

这里是驱动程序:

import java.util.Random;
import java.util.Scanner;

/**
 * This program is used as a driver program to play the game from the
 * class LostPuppy.  Not to be used for grading!
 *
 * A puppy is lost in a multi-floor building represented in the class 
 * LostPuppy.class.  Two players will take turns searching the building
 * by selecting a floor and a room where the puppy might be.
 *
 * @author David Schuessler
 * @version Spring 2015
 */

public class PuppyPlay
{
  /**
   * Driver program to play LostPuppy.
   *
   * @param theArgs may contain file names in an array of type String
   */
  public static void main(String[] theArgs)
  {
    Scanner s = new Scanner(System.in);
    LostPuppy game; 
    int totalFloors;
    int totalRooms;
    int floor;
    int room;
    char[] players = {'1', '2'};
    int playerIndex;
    boolean found = false;
    Random rand = new Random();

    do 
    {
      System.out.print("To find the puppy, we need to know:\n"
                       + "\tHow many floors are in the building\n"
                       + "\tHow many rooms are on the floors\n\n"
                       + "             Please enter the number of floors: ");
      totalFloors = s.nextInt();
      System.out.print("Please enter the number of rooms on the floors: ");
      totalRooms = s.nextInt();
      s.nextLine();    // Consume previous newline character    

      // Start the game: Create a LostPuppy object:
      game = new LostPuppy(totalFloors, totalRooms);

      // Pick starting player
      playerIndex = rand.nextInt(2);

      System.out.println("\nFloor and room numbers start at zero '0'");

      do 
      {

        do 
        {
          System.out.println("\nPlayer " + players[playerIndex]
                             + ", enter floor and room to search separated by a space: ");
          floor = s.nextInt();
          room = s.nextInt();

          //for testing, use random generation of floor and room
          //floor = rand.nextInt(totalFloors);
          //room = rand.nextInt(totalRooms);
        } while (!game.indicesOK(floor, room) 
                 || game.roomSearchedAlready(floor, room));


        found = game.searchRoom(floor, room, players[playerIndex]);
        playerIndex = (playerIndex + 1) % 2;
        System.out.println("\n[" + floor + "], [" + room + "]");
        System.out.println(game.toString());
        s.nextLine();
      } while (!found);

      playerIndex = (playerIndex + 1) % 2;
      System.out.println("Great job player " + players[playerIndex] +"!");
      System.out.println("Would you like to find another puppy [Y/N]? ");
    } 
    while (s.nextLine().equalsIgnoreCase("Y"));
  }
}

最后,这是我的测试代码:

import java.util.Random;
import java.util.Scanner;

public class LostPuppy
{

   char[][] myHidingPlaces;
   int myFloorLocation;
   int myRoomLocation;
   char myWinner;
   boolean myFound;
   Random random = new Random();

   public void LostPuppy(int theFloors, int theRooms)
   {// this ^ void is the issue and is now removed from my code(answered 7/14/2015 on stack overflow)
      char[][] myHidingPlaces = new char[theFloors][theRooms];

      for (int i = 0; i < theFloors; i++)
      {
         for (int j = 0; j < theRooms; j++)
         {
            myHidingPlaces[i][j] = ' ';
         }
      }

      myFloorLocation = random.nextInt(theFloors);
      myRoomLocation = random.nextInt(theRooms);
      myHidingPlaces[myFloorLocation][myRoomLocation] = 'P';
      myWinner = ' ';
      myFound = false;  
   }
   public boolean roomSearchedAlready(int floor, int room)
   {
      if (myHidingPlaces[floor][room] == '1' || 
          myHidingPlaces[floor][room] == '2')
          {
            return true;
          }
      else
      {
         return false;
      }
   }

   public boolean puppyLocation(int floor, int room)
   {
      if (myHidingPlaces[floor][room] == 'P')
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   public boolean indicesOK(int floor, int room)
   {
      if (floor <= myHidingPlaces.length || room <= myHidingPlaces[0].length)
      {
         return true;
      }
      else
      {
         return false;
      }
   }

   public int numberOfFloors()
   {
      return myHidingPlaces.length - 1;
   }
   public int numberOfRooms()
   {
      return myHidingPlaces[0].length - 1;
   }

   public boolean searchRoom(int floor, int room, char player)
   {
      if (myFound = true)
      {
         myWinner = player;
         myFound = true;
         return true;
      }
      else
      {
         myHidingPlaces[floor][room] = player;
         return false;
      }
   }

   public String toString()
   {
      return "this is a test";

   }

}

【问题讨论】:

  • 您是否想让这行“public void building(int theFloors, int theRooms)”成为LostPuppy 类的构造函数? (顺便说一句,这个问题做得很好。)
  • 当您还没有为LostPuppy 定义任何构造函数时,您希望new LostPuppy(totalFloors, totalRooms) 如何工作?阅读您收到的错误消息(提示:它们并不含糊,事实上,它们是完全明确的)并意识到它基本上表示您正在尝试调用不存在的方法。

标签: java arrays constructor


【解决方案1】:

我不希望在任何回复中为我的作业提供任何具体的解决方案 到这个帖子。这些问题是我要弄清楚的。我想要的是 关于为什么我的测试代码无法编译/运行的解释。

这一行

game = new LostPuppy(totalFloors, totalRooms);

无法编译,因为您没有定义任何期望两个 int 作为参数的构造函数(totalFloors 和 totalRooms)。

为了解决这个问题,请在你的类LostPuppy 中声明一个构造函数,例如

public LostPuppy(int totalFloors, int totalRooms)
{
    //Do something here with paremeters..
}

这一行

while (!game.indicesOK(floor, room) 

无法编译,因为您尚未在 LostPuppy 类中定义任何 indicesOk 方法。

创建方法如

public boolean indicesOK(int floot, int room)
{
    //return some conditions
}

【讨论】:

  • @Jean-François Savard 有一个简短的问题,添加此方法后:prntscr.com/7srv8m 我收到此错误:prntscr.com/7srvdy 在这种情况下我不明白它怎么可能为空。
  • @Jean-François Savard 所以即使我有 char[][] myHidingPlaces;在我的代码前面,它不会将 myHidingPlaces 识别为已初始化?它必须在它使用的方法中初始化?还是因为我在以前的方法中更改了数组,但在该方法之外该字段仍然为空?
  • @Jean-François Savard 对,我的意思是我在这里的构造函数中为二维数组赋值:prntscr.com/7ss0j8。我认为数组长度会保持不变,我可以通过另一种方法使用它们。所以你是说我必须找到一种方法来获取长度值而不使用 myHidingPlaces?还是有其他方法可以做到这一点?
  • @Jean-François Savard 我更新了我的代码,添加了 indicesOK 方法。驱动程序永远不会改变,所以我保持不变。
  • @Trafton 问题是因为在您的方法中您重新创建了一个变量myHidingPlaces,它隐藏了另一个变量,因此您永远不会分配给类范围的数组。将char[][] myHidingPlaces = ... 更改为myHidingPlaces = ..
【解决方案2】:

我认为你的building 方法应该是构造函数:

public LostPuppy(int theFloors, int theRooms)
{
  myHidingPlaces = new char[theFloors][theRooms]; //this line

  for (int i = 0; i < theFloors; i++)
  {
     for (int j = 0; j < theRooms; j++)
     {
        myHidingPlaces[i][j] = ' ';
     }
  }

  myFloorLocation = random.nextInt(theFloors);
  myRoomLocation = random.nextInt(theRooms);
  myHidingPlaces[myFloorLocation][myRoomLocation] = 'P';
  myWinner = ' ';
  myFound = false;  
}

注意:看标记行,不要定义类型,如果定义了类型,它会变成局部变量而不是实例变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多