在java中while循环外使用变量

gwbalxhn  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(362)

我正在尝试用java编写一个程序,在数组中收集用户最喜欢的名称,然后在最后打印这些名称。
注意:数组的长度应由用户输入的名称数定义。
请看一下代码并告诉我如何修复它。这是我到目前为止所做的

Scanner input = new Scanner(System.in);

System.out.println("What are your most favorite names?");

String[] favNames = new String[i];
int i = 1;

while (true){
    System.out.print("Please enter favorite name number" + i + ":  ");
    favNames[i-1] = input.next();
    System.out.print("Is that all?");
    String ans = input.next().toLowerCase();
    if(ans.startsWith("y")){
        System.out.print("Here is the completed list of your favorite names:\n" + Arrays.toString(favNames));
        break;
    }
    i++;
}

这是我得到的错误代码:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable i
location: class JavaApplication13
at JavaApplication13.main(JavaApplication13.java:52)
Java Result: 1

我尝试在循环中移动代码的第一部分,但它只打印用户输入的一个名称。

//These parts:
String[] favNames = new String[i];
int i = 1;

如果我在第一行和第二行之间交换位置。数组仅从用户处获取1个条目。

//Only gets one entry
int i = 1;
String[] favNames = new String[i];
lyfkaqu1

lyfkaqu11#

只要把i++移到while循环中,一切就好了!

46qrfjad

46qrfjad2#

变量应该在使用前声明。这就是你的程序不起作用的原因。
改变

String[] favNames = new String[i];
int i = 1;

int i = 1;
String[] favNames = new String[i];

但是,请记住,在这种情况下,使用的数组只能输入1次(因为数组的大小是固定的)。如果要使用任意数量的输入,则必须使用 ArrayList 或类似类型。

mbskvtky

mbskvtky3#

在使用变量之前声明变量:

int i = 1;
        String[] favNames = new String[i];

但是,大小为1的数组只能用于1个条目。如果您希望用户能够输入更多,您需要一个更大的数组。
我建议使用任意大的大小(比如100),然后检查条目是否适合数组;如果没有,游戏结束。

String[] favNames = new String[100];

int i = 1;
while (true) {
    System.out.print("Please enter favorite name number" + i + ":  ");
    favNames[i - 1] = input.next();
    System.out.print("Is that all?");
    String ans = input.next().toLowerCase();
    if (ans.startsWith("y")) {
        System.out.print("Here is the completed list of your favorite names:\n" + Arrays.toString(favNames));
        break;
    }
    i++;
    if (i > favNames.length)
        System.out.print("Can't accept more than "+favNames.length+" entries, here is the completed list of your favorite names:\n" + Arrays.toString(favNames));
}

那么问题是 Arrays.toString 将打印 null 对于空条目。
我将制作一个自定义例程来打印以第一个空值结尾的数组:

static String printFavNames(String[] favNames) {
    String output = "[";
    for (String s : favNames) {
        if (s==null)
            break;
        if (output.length() > 1)
            output += ", ";
        output += s;
    }
    output += "]";
    return output;
}

相关问题:如何使用array.tostring()打印数组的所有非空元素
完整代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.println("What are your most favorite names?");

        String[] favNames = new String[100];

        int i = 1;
        while (true) {
            System.out.print("Please enter favorite name number" + i + ":  ");
            favNames[i - 1] = input.next();
            System.out.print("Is that all?");
            String ans = input.next().toLowerCase();
            if (ans.startsWith("y")) {
                System.out.print("Here is the completed list of your favorite names:\n" + printFavNames(favNames));
                break;
            }
            i++;
            if (i > favNames.length)
                System.out.print("Can't accept more than "+favNames.length+" entries, here is the completed list of your favorite names:\n" + printFavNames(favNames));
        }
        input.close();
    }
    static String printFavNames(String[] favNames) {
        String output = "[";
        for (String s : favNames) {
            if (s==null)
                break;
            if (output.length() > 1)
                output += ", ";
            output += s;
        }
        output += "]";
        return output;
    }
}

相关问题