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