Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个字符串扫描到ArrayList会返回意外结果。(Java,简单,初学者)_Java_Arraylist - Fatal编程技术网

将多个字符串扫描到ArrayList会返回意外结果。(Java,简单,初学者)

将多个字符串扫描到ArrayList会返回意外结果。(Java,简单,初学者),java,arraylist,Java,Arraylist,这是我的意思: public class ArrayTest { private static ArrayList<String> atf() { ArrayList<String> array = new ArrayList<>(); while(true) { Scanner i = new Scanner(System.in); String input = i.n

这是我的意思:

public class ArrayTest {
    private static ArrayList<String> atf() {
        ArrayList<String> array = new ArrayList<>();

        while(true) {
            Scanner i = new Scanner(System.in);
            String input = i.next();

            System.out.println(input);

            array.add(input);

            System.out.println("Here i am!");

            if(i.next().equals("exit")) {
                System.out.println("Cyka");
                break;
            }
        }

        return array;
    }

    public ArrayTest() {
        System.out.println(atf().toString().replace('[', ' ').replace(']', ' '));
    }
}
公共类数组测试{
专用静态ArrayList atf(){
ArrayList数组=新的ArrayList();
while(true){
扫描器i=新扫描器(System.in);
字符串输入=i.next();
系统输出打印项次(输入);
array.add(输入);
System.out.println(“我在这里!”);
如果(i.next().equals(“exit”)){
System.out.println(“Cyka”);
打破
}
}
返回数组;
}
公共阵列测试(){
System.out.println(atf().toString().replace('[','').replace(']','');
}
}
我只得到一些输入来触发“我在这里!”。 我真的很困惑,为什么只有每秒钟左右的输入才会被添加到ArrayList中。作为一个完全的初学者,我希望问题不是太明显,希望你们能帮助我。 多谢


初始反馈后编辑:

public class ArrayTest {
private static ArrayList<String> atf() {

    ArrayList<String> array = new ArrayList<>();
    Scanner i = new Scanner(System.in);

    while(i.hasNext() && !(i.next().equals("exit"))) {

        System.out.println(i.next());
        String string = i.next();
        array.add(string);
    }   
    i.close();

    return array;
}

public ArrayTest() {
    System.out.println(atf().toString().replace('[', ' ').replace(']', ' '));
}
公共类数组测试{
专用静态ArrayList atf(){
ArrayList数组=新的ArrayList();
扫描器i=新扫描器(System.in);
而(i.hasNext()&&!(i.next().equals(“exit”)){
System.out.println(i.next());
String String=i.next();
add(字符串);
}   
i、 close();
返回数组;
}
公共阵列测试(){
System.out.println(atf().toString().replace('[','').replace(']','');
}
每三个“字符串”将被打印出来。
更改是否正常?

之所以只添加每秒一次输入,是因为其他输入都被您的“退出”检查消耗掉了

你应该这样写:

try (Scanner i = new Scanner(System.in)) {
    List<String> list = new ArrayList<>();
    while (true) {
        String next = i.next();

        list.add(next);

        if ("exit".equals(next)) {
            System.out.println("Cyka");
            break;
        }
    }
    return list;
}
try(扫描器i=新扫描器(System.in)){
列表=新的ArrayList();
while(true){
字符串next=i.next();
列表。添加(下一步);
如果(“退出”。等于(下一步)){
System.out.println(“Cyka”);
打破
}
}
退货清单;
}
这里最大的区别是,
Scanner.next()
只被调用一次,而不是两次。这就是为什么每个输入都会被添加到列表中,而原始代码会“删除”为“退出”检查记录的输入


在try语句中创建扫描器也将确保扫描器在最后关闭。

之所以只添加每秒一次输入,是因为您的“退出”检查消耗了其他输入

你应该这样写:

try (Scanner i = new Scanner(System.in)) {
    List<String> list = new ArrayList<>();
    while (true) {
        String next = i.next();

        list.add(next);

        if ("exit".equals(next)) {
            System.out.println("Cyka");
            break;
        }
    }
    return list;
}
try(扫描器i=新扫描器(System.in)){
列表=新的ArrayList();
while(true){
字符串next=i.next();
列表。添加(下一步);
如果(“退出”。等于(下一步)){
System.out.println(“Cyka”);
打破
}
}
退货清单;
}
这里最大的区别是,
Scanner.next()
只被调用一次,而不是两次。这就是为什么每个输入都会被添加到列表中,而原始代码会“删除”为“退出”检查记录的输入


在try语句中创建扫描器将确保扫描器在最后关闭。

首先,您应该声明扫描器超出循环。然后,您将等待一个值以检查
是否退出。您要检查
输入是否退出
在将其添加到数组或不添加到数组并退出循环之前。并在末尾关闭扫描仪;)使用该信息编辑问题;)每次调用
next
都将等待您的输入。存储一个输入,然后使用它。首先,您应该声明扫描仪超出循环。然后,您将等待一个值以检查
是否退出或否。在将其添加到数组中之前,您要检查
输入是否
=
“退出”
,然后退出循环。最后还要关闭扫描仪;)使用该信息编辑问题;)每次调用
next
都将等待您的输入。存储一个输入,然后使用它。“使用资源重试”这显然是一个很好的观点。请注意,在这样的方法中这是有风险的,如果OP调用两次atf
atf
,它将不起作用。不客气。我希望我能很容易地理解发生了什么。@AxelH,你能解释一下为什么它不起作用吗?我自己对输入流和扫描仪不太有经验。我试着调用aft()两次,当我调用next()时,它给了我一个NoTouchElementException第一次运行是在第二次运行时。但是扫描仪不是新初始化的吗?您有什么资源可以阅读吗?当您关闭
扫描仪时,您将关闭到它的流链接,在这种情况下是
系统。
中的
系统的问题。
正如name类告诉它的那样,它是由系统初始化的m(JVM)在主初始化期间,在调用
main
方法之前。因此,一旦关闭它,就无法重新打开它。对于初始代码,这不是问题,因为我们的扫描仪到处都泄漏(也不太好)。当您使用这样的扫描仪时,最好让
main
方法来创建和关闭它。您只需将其声明为静态或在参数中共享它。感谢您的解释,现在您对它的解释非常明显。@Robschmok我添加了try块,以便在您使用完扫描仪后关闭它。但是在本例中例如,它可能有一个副作用,即您还关闭了
系统。正如Axel所解释的,在
流中,因此您不能再次使用它。如果这只是一个小的游乐场项目,那么您是否关闭扫描仪并不重要,但在一个更大的项目中,您应该解决这个问题。“使用资源进行尝试”这显然是一个很好的观点。请注意,在这样的方法中这是有风险的,如果OP调用两次atf
atf
,它将不起作用。不客气。我希望我能很容易地理解发生了什么。@AxelH,你能解释一下为什么它不起作用吗?我自己对输入流和扫描仪不太有经验。我试着调用aft()两次,它给了我一个吻