在 java 中的 while 循环外使用变量

Using variables outside while loops in java

我正在尝试在 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];

只需将 i++ 移动到 while 循环内,一切都很好!

变量应该在使用前声明。这就是您的程序无法运行的原因。

改变

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

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

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

  1. 在使用之前声明变量:
        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

我会创建一个自定义例程来打印以第一个 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;
}

相关问题:How to print all non null elements of an array using 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;
    }
}