Java - 错误:构造函数"构造函数名称"在班级"班级名称"无法应用于给定类型;

时间:2015-07-14 22:36:30

标签: java arrays constructor

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

以下是作业:

你要设计一个类“LostPuppy.java”,它代表一个在多层建筑中丢失的小狗 每层楼的房间数量相同。在实例化(或创建)此类对象的过程中, 每层楼的每个房间都会被初始化为空(你实际上会使用空格''字符 目的)并且将选择一个随机的房间,在那里小狗失踪。为此,字符“P”将 被放置在这个随机位置。有关构造函数的更多详细信息如下所示。

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

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

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

  • 两个整数将占据失去小狗的地板和房间,名为myFloorLocation和 myRoomLocation。

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

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

构造

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

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

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

  • 使用第一个参数
  • 随机设置myFloorLocation(楼层小狗已启用)
  • 使用第二个参数
  • 随机设置myRoomLocation(房间小狗在)
  • 将myHidingPlaces [myFloorLocation] [myRoomLocation]设置为char'P'
  • 将myWinner设置为单个空格
  • 将myFound设为false

方法:

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

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

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

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

  • numberOfRooms返回建筑物每层楼的房间数量(第一个房间开始于 零和所有楼层都有相同数量的房间。)

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

  • toString显示当前的hidePlaces数组及其内容除了小狗的位置 在他/她被发现之前,它将保持隐藏状态.string将被调用(由驱动程序)和两者 找到小狗的玩家和'P'将显示在同一个单元格中......

  • 现在,也许是toString输出的尴尬部分。通常,在显示2D数组时, [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";

   }

}

2 个答案:

答案 0 :(得分:5)

  

我不希望在任何回复中对我的作业有任何具体的解决方案   到这篇文章。那些问题让我想出来。我想要的是   解释为什么我的测试代码不会编译/运行。

这一行

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) 

由于您未在indicesOk课程中定义任何LostPuppy方法,因此无法编译。

创建一个方法,例如

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

答案 1 :(得分: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;  
}

注意:查看标记的行,不定义类型,如果定义类型,它将变为局部变量而不是实例变量。