在为数组

时间:2017-11-08 21:30:44

标签: java arrays

我在完成任务时遇到了一些麻烦。关键是要创建一个程序,它将生成一个介于0和1之间的随机数,然后如果是头,则将“h”保存到数组中的下一个空闲空间,如果是尾部则保存“s”。问题是,当我运行程序时,它给我一个错误“线程中的异常”主“java.lang.ArrayIndexOutOfBoundsException:2”,因为(我认为)它一直到达数组的末尾,任何人都可以帮助?

import java.util.Random;
public class CoinToss{

   public int heads;
   public int tails;
   public int totalToss;
   public int arraySize;
   public int numOfTails = 0;
   public int numOfHeads = 0;
   public String [] array = new String[arraySize];

   public CoinToss(int NumberOfTosses) {
      arraySize = NumberOfTosses;
   }

   public int getHeads() {
      return heads;
   }

   public int getTails() {
      return tails;
   }

   public int totalTosses() {
      return totalToss;
   }

   public void tossCoin() {
      for (int i = 0; i <= arraySize; i++) {
         double randomNumber = Math.random();

         if (randomNumber < 0.5) {
            array[arraySize] = "t";
            numOfTails++;
         } else {
            for (int j = 0; j <= arraySize; j++) {
               if (randomNumber >= 0.5) {
                  array[arraySize] = "h";
                  numOfHeads++;
               }
            }

         }
      }
   }
}

和测试者类:

import java.util.Scanner;
public class CointTossTester {
   public static void main (String[] args){
      Scanner sc = new Scanner(System.in);

      System.out.println("Number of tosses ");
      int number = sc.nextInt();

      CoinToss coin = new CoinToss(number);

      coin.tossCoin();
      System.out.println("Ight deez niggers be: " +coin.array);
}
}

谢谢!

3 个答案:

答案 0 :(得分:1)

public void tossCoin() { for (int i = 0; i <= arraySize; i++) { double randomNumber = Math.random();

您未正确实例化arraySize

编辑(感谢下面的评论):

首先要做的事情: 当您为CoinToss课程声明属性时,您的arraysize默认为0,但接下来的两行中您声明String [] array = new String[arraySize]。这意味着您的数组被声明为大小为0的数组。

要解决这个特定问题,您必须在类字段声明中将public String [] array = new String[arraySize]拆分为public String [] array;,并在构造函数中将array = new String[arraySize]拆分为public class CoinToss { public int heads; public int tails; public int totalToss; public int arraySize; public int numOfTails = 0; public int numOfHeads = 0; public String[] array; public CoinToss(int NumberOfTosses) { arraySize = NumberOfTosses; array = new String[arraySize]; } // rest of the code } 。所以它看起来像是:

    public void tossCoin() {
        for (int i = 0; i <= arraySize; i++) {
            double randomNumber = Math.random();

            if (randomNumber < 0.5) {
                array[arraySize] = "t";
                numOfTails++;
            } else {
                for (int j = 0; j <= arraySize; j++) {
                    if (randomNumber >= 0.5) {
                        array[arraySize] = "h";
                        numOfHeads++;
                    }
                }

            }
        }
    }

这解决了一个问题。

第二个是你在tossCoin方法的代码中进一步说明:

for (int i = 0; i <= arraySize; i++) {

并且线条:         for (int j = 0; j <= arraySize; j++) {load("@bazel_skylib//:lib.bzl", "paths") def java_testng(file, deps=[], size="small", **kwargs): native.java_library( name = paths.split_extension(file)[0] + "-lib", deps = [ "//third_party:org_testng_testng" ] + deps, srcs = [file] ) native.java_test( name = paths.split_extension(file)[0], use_testrunner=False, main_class='org.testng.TestNG', runtime_deps = [ "//third_party:org_testng_testng", paths.split_extension(file)[0] + "-lib" ], data = [file], size = size, args=["-testclass $(location " + file + ")"], **kwargs ) 是错误的,因为在某个时刻您正在访问数组的第5个元素,当它的最后一个索引是4时。

答案 1 :(得分:1)

主要问题没有使用正确的变量来放置&#34; h&#34;或&#34; t&#34;数组中的值。你使用:

array[arraySize] ...

但是,arraySize是数组的大小。您需要使用变量i,这是循环计数器:

array[i] = "t"; // or "h", depending.

您还没有执行正确的循环次数

for (int i = 0; i <= arraySize; i++) {

由于您已指出<=,这意味着您可以达到阵列的大小。但由于数组索引从0开始,你应该使用:

for (int i = 0; i < arraySize; i++) { // notice "<" instead of "<="

我还建议只有在构造函数中获得arraySize的值后才初始化String数组:

public CoinToss(int NumberOfTosses) {
    arraySize = NumberOfTosses;
    array = new String[arraySize];
}

答案 2 :(得分:1)

array的初始化更改为与所有其他人一样的声明:

public String [] array;

然后,更改构造函数,使其正确初始化array

public CoinToss(int NumberOfTosses) {
   arraySize = NumberOfTosses;
   array = new String[arraySize];
}

您的for循环从0转到arraySize(比最后一个索引多一个,所以它不会起作用)。它应该转到arraySize-1,这会将其更改为:

for (int i = 0; i < arraySize; i++) {

此外,您不应该使用arraySize来访问array,而是i,这是您的循环变量,如下所示:

array[i] = "t";

现在,你不需要另一个循环,也不需要第二个条件,随机数低于0.5或更高,你可以相应地设置它,如下所示:

if (randomNumber < 0.5) {
   array[i] = "t";
   numOfTails++;
} else {
   array[i] = "h";
   numOfHeads++;
}

最后,打印一个数组并不像将它与字符串连接一样简单,你应该通过它或者使用另一个实用程序(我个人喜欢Arrays.toString方法)打印它,如下所示:< / p>

System.out.println("Ight deez niggers be: " +Arrays.toString(coin.array));

这里有一个working example [注意:我将main方法放在Coin