为什么String数组中的随机索引返回null?

时间:2016-12-19 16:08:50

标签: java arrays

我想允许用户输入一个数字,它将是字符串数(选项)。然后程序将生成一个介于0和数组长度之间的随机数,并显示与随机数的idex匹配的元素。但是每当我运行程序时,输出只是说" null"。我附上了我的代码。任何建议都会有所帮助,谢谢。

import java.util.Scanner;
import java.util.Arrays;
public class Decision{
    public static void main (String[] args){

        Scanner I= new Scanner(System.in);

        System.out.println("How many choices would you like to choose from?");

        int i=I.nextInt();

        System.out.println("Enter the " + i + " choices:");

        Scanner C= new Scanner(System.in);

        String c= C.nextLine();

        String[] options=new String[i];

        int random = (int)(Math.random() * i +1);

        String choice = options[random];
        System.out.println(choice);

    }
}

2 个答案:

答案 0 :(得分:0)

您的代码有多个问题:

  • 您的控制台输出为null,因为在创建数组String[] options = new String[i];后,您永远不会为其分配任何字符串,因此所有元素都保留null
  • 您需要一个循环来使用扫描仪检索多行,C.nextLine();只读取一行并且无论如何都不使用它。
  • 您不使用java.util.Arrays导入。
  • 您不应该创建新的扫描仪,因为您可以重复使用第一台扫描仪进行所有输入。
  • 请为变量使用有意义的名称,请考虑naming conventions
  • 数组索引的随机数Math.random() * i + 1)不正确。

此修改后的代码可以帮助您:

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

public class Decision {

    public static void main (String[] args){

        Scanner scanner = new Scanner(System.in);
        System.out.println("How many choices would you like to choose from?");

        // I use an ArrayList, because it may be hand
        int count = scanner.nextInt();
        String[] choices = new String[count];

        // Necessary, because nextInt() does not consume
        // the newline character.
        scanner.nextLine();

        System.out.println("Enter the " + count + " choices:");

        for (int i = 0; i < count; i++) {
            choices[i] = scanner.nextLine();
        }

        // The method nextInt(int bound) returns an integer
        // in range [0, count - 1].
        Random random = new Random();
        int randomChoice = random.nextInt(count);

        System.out.println(options[randomChoice]);

    }
}

为什么RandomMath.random()更好的选择已经讨论了in this post,扫描人员和nextInt()的问题可以找到here。< / p>

答案 1 :(得分:0)

您的代码存在很多问题。

首先,在nextLine之后调用nextInt可能会返回""因为nextInt没有读取换行符。我建议您将I.nextInt()替换为Integer.parseInt(I.nextLine())

其次,一台扫描仪就足够了。无需创建两个:IC。您还应该适当地命名变量。

第三,如果你想让用户输入一堆东西,你应该使用一个循环。我认为for循环适合这种情况。

最后,我个人不喜欢Math.random()。这使得很难看出你生成的随机数范围。我建议您使用Random(请参阅随机数部分)对象。

如果你很懒(我希望你不是),请参阅以下代码:

    Scanner scan = new Scanner(System.in);

    System.out.println("How many choices would you like to choose from?");

    int numberOfChoices = Integer.parseInt(scan.nextLine());
    String[] options = new String[numberOfChoices];

    for (int i = 0 ; i < numberOfChoices ; i++) {
        System.out.println("Enter choice " + (i + 1) + ":");
        options[i] = scan.nextLine();
    }
    Random rand = new Random();
    int random = rand.nextInt(numberOfChoices);

    String choice = options[random];
    System.out.println(choice);