如何在Java中动态初始化数组?

时间:2018-05-18 06:43:41

标签: java arrays dynamic foreach syntax

我试图动态初始化数组并显示数组 结果:

import java.util.Scanner;

public class Arrays {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int[] c;
        String cmd="yes";
        while(cmd=="yes") {
            System.out.println("Enter value for c :");
            c=new int[] {in.nextInt()};
            System.out.println("Continue(yes/no)? :");
            cmd=in.next();
        }
        for(int k:c)
            System.out.println(k);
    }
}

但是在for-each循环(即main()的第12行)中,它显示错误为"局部变量c可能尚未初始化"。

2 个答案:

答案 0 :(得分:2)

其他答案都是正确的,你没有初始化你的数组。您需要致电c=null;才能使其正常工作。

但是,如果我理解正确,那么您正在尝试将数字添加到不确定大小的数组中,这是Java无法做到的。你应该使用ArrayList。

您还使用==来比较字符串值,这是一个很大的禁忌,我在下面的答案中将其更改为.equals

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner in = new Scanner(System.in);
    ArrayList<Integer> c = new ArrayList<>();
    String cmd="yes";
    while(cmd.equals("yes")) {
        System.out.println("Enter value for c :");
        c.add((Integer)in.nextInt());
        System.out.println("Continue(yes/no)? :");
        cmd=in.next();
    }
    for(Integer k:c)
        System.out.println(k);
}

答案 1 :(得分:0)

对于实际编译错误,如果未执行循环,则c可能无法初始化。即使你知道它会(因为cmd等于"yes",编译器也不会那么远)。

您会找到最初初始化值的答案,例如Neng Liu's answer,但根据您的逻辑,您可以使用do..while循环,因为您的逻辑显示您想要至少读取一次Scanner

do{
    System.out.println("Enter value for c :");
    c=new int[] {in.nextInt()};
    System.out.println("Continue(yes/no)? :");
    cmd=in.next();
}while("yes".equals(cmd)); //.equals is needed to compare `String` correctly

执行块语句后检查do..while中的条件(与之前检查条件的while比较)。因此语句将至少执行一次,因此您确定c将以这种方式初始化。编译器也知道这一点。

由于标题提及您需要动态大小的数组,请参阅HamishD's answer以使用将根据需求增长的Collection。有关List的更完整帖子,请参阅Java dynamic array sizes?