GVKun编程网logo

Java.Util.Scanner的NoSuchElementException

25

本篇文章给大家谈谈Java.Util.Scanner的NoSuchElementException,同时本文还将给你拓展1-解决javaScanner出现java.util.NoSuchElement

本篇文章给大家谈谈Java.Util.Scanner的NoSuchElementException,同时本文还将给你拓展1-解决java Scanner出现 java.util.NoSuchElementException、Cursor.hasNext引发java.util.NoSuchElementException、java – 在List中查找匹配时的NoSuchElementException、Java 使用Scanner时的NoSuchElementException异常等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java.Util.Scanner的NoSuchElementException

Java.Util.Scanner的NoSuchElementException

我是Java的新手,但是正在阅读《 Java:如何编程》(第9版)一书,并举了一个例子,在我的一生中,我无法弄清楚问题出在哪里。

这是教科书中源代码示例的(略)增强版本:

import java.util.Scanner;public class Addition {  public static void main(String[] args) {    // creates a scanner to obtain input from a command window    Scanner input = new Scanner(System.in);    int number1; // first number to add    int number2; // second number to add    int sum; // sum of 1 & 2    System.out.print("Enter First Integer: "); // prompt    number1 = input.nextInt(); // reads first number inputted by user    System.out.print("Enter Second Integer: "); // prompt 2     number2 = input.nextInt(); // reads second number from user    sum = number1 + number2; // addition takes place, then stores the total of the two numbers in sum    System.out.printf( "Sum is %d\n", sum ); // displays the sum on screen  } // end method main} // end class Addition

我收到“NoSuchElementException”错误:

Exception in thread "main" java.util.NoSuchElementExceptionat java.util.Scanner.throwFor(Scanner.java:838)at java.util.Scanner.next(Scanner.java:1461)at java.util.Scanner.nextInt(Scanner.java:2091)at java.util.Scanner.nextInt(Scanner.java:2050)at Addition.main(Addition.java:16)Enter First Integer:

我知道这可能是由于源代码中的某些内容与Scannerfrom中的类不兼容所致java.util,但是在推断出问题所在的方面,我确实无法获得更多的帮助。

答案1

小编典典

NoSuchElementExceptionnextElement枚举方法抛出以指示枚举中没有更多元素。

http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html

这个怎么样 :

if(input.hasNextInt() )     number1 = input.nextInt(); // if there is another number  else      number1 = 0; // nothing added in the input 

1-解决java Scanner出现 java.util.NoSuchElementException

1-解决java Scanner出现 java.util.NoSuchElementException

起因:在函数中新建scanner对象,然后多次调用此方法出现上述异常

原因:Scanner(system.in)在Scanner中接受的是键盘 输入,当调用close()方法时

Scanner的关闭会导致System.in的关闭,System.in是标准输入(键盘输入),只能关一次,关闭后不能再打开。

解决办法1:在主函数的声明,然后作为参数传入方法中

解决办法2:

  查看scanner源码

// Boolean indicating if this scanner has been closed
    private boolean closed = false;

public void close() {
        if (closed)
            return;
        if (source instanceof Closeable) {
            try {
                ((Closeable)source).close();//将会关闭流
            } catch (IOException ioe) {
                lastException = ioe;
            }
        }
        sourceClosed = true;
        source = null;
        closed = true;
    }

   直接在函数中用反射改变closed的值,实现永远不关闭

 

public void scanner() throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        Scanner my=new Scanner(System.in);

        a=my.nextInt();
        b=my.nextInt();
        c=my.nextInt();
        Class clazz  =Scanner.class;
        Field field = clazz.getDeclaredField("closed");
        field.setAccessible(true);
        field.set(my,true);
        my.close();
    }

 

  当想要关闭的时候,再使用反射改变为false,调用scanner.close();

 

Cursor.hasNext引发java.util.NoSuchElementException

Cursor.hasNext引发java.util.NoSuchElementException

public String ForDate(String date) {    MongoCursor<Document> cursor = collection.find(eq("date", date)).iterator();    basicb b = new basicb();    while (cursor.hasNext()) {       b.setDepartament(cursor.next().getString("departament"));       b.setText(cursor.next().getString("text"));       b.setTitle(cursor.next().getString("title"));       lista.add(b);    }}

我只想从mongodb信息中处理对象,但是当我执行此方法时,要使一些对象成为对象,但总是返回该错误java.util.NoSuchElementException。

答案1

小编典典

可能的问题是,您next在一个循环中调用了3次方法。您应该调用一次并将其结果存储在变量中,因为它会next检索迭代中的下一个元素

while (cursor.hasNext()) {   Document element = cursor.next();   b.setDepartament(element.getString("departament"));   b.setText(element.getString("text"));   b.setTitle(element.getString("title"));   lista.add(b);}

java – 在List中查找匹配时的NoSuchElementException

java – 在List中查找匹配时的NoSuchElementException

以下老式,简单的代码工作正常(遍历字符串列表,并返回true,因为应该匹配):

public boolean isMatched() {
  List<String> stringList = Arrays.asList("str1","str2","str3");
  String matchString = "str1";

  for (String str : stringList) {
    if (StringUtils.equals(str,matchString)) {
        return true;
    }
  }

  return false;
}

现在,我想做同样的事情,但改用Java 8.到目前为止我有这个:

public boolean isMatched() {
  List<String> stringList = Arrays.asList("str1","str3");
  String matchString = "str1";
  return (stringList.stream().filter(str -> StringUtils.equals(matchString,str)).findFirst().get() != null);
}

使用第二种方法,我收到以下错误:

java.util.NoSuchElementException: No value present [junit] at java.util.Optional.get(Optional.java:135)

为什么我会收到此错误,我应该怎么做才能解决?

解决方法

Optional.get()仅在您知道其中存在实际值时使用.如果没有价值,它会抛出NSEE,正如您所发现的那样.

看起来你想要.findFirst().isPresent(),或者如下所述,anyMatch(谓词).

Java 使用Scanner时的NoSuchElementException异常

Java 使用Scanner时的NoSuchElementException异常

  做实验时设计了一个类,在类中的两个不同函数中分别创建了两个Scanner对象,并且在各个函数的结尾使用了close()方法,结果在运行时产生了NoSuchElementException异常。

  实验的中的类和下方代码差不多,记录一下异常的原因。

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6 
 7     public static void main(String[] args) {
 8         Info info = new Info();  //实例化Info对象,调用两个方法
 9         info.test1();
10         info.test2();
11     }
12 
13 }
14 
15 class Info{
16 
17     public void test1(){
18         Scanner scan = new Scanner(system.in);  //创建第一个Scanner对象
19         String info = scan.next();
20         System.out.println(info);
21         scan.close();                 //在结尾使用close()关闭Scanner
22     }
23 
24     public void test2(){
25         Scanner scan2 = new Scanner(system.in);  //第二个Scanner对象
26         String info = scan2.next();
27         System.out.println(info);
28         scan2.close();
29     }
30 }

运行结果:

12
12
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at Test.Info.test2(Main.java:26)
at Test.Main.main(Main.java:10)

Process finished with exit code 1

===============================================================

  在网上查找资料后发现,system.in在源码中是这样定义的:

    public final static InputStream in = null;

  system.in是静态的,当前类中所有System对象共享,在使用close()方法时,会同时关闭Scanner和system.in,而system.in关闭后不能再打开,当第二个函数再次想实例化Scanner时就会抛出NoSuchElementException异常。

  解决方法是在主方法中调用方法时在参数中传入Scanner对象,或者在类中最后关闭Scanner。

关于Java.Util.Scanner的NoSuchElementException的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于1-解决java Scanner出现 java.util.NoSuchElementException、Cursor.hasNext引发java.util.NoSuchElementException、java – 在List中查找匹配时的NoSuchElementException、Java 使用Scanner时的NoSuchElementException异常的相关信息,请在本站寻找。

本文标签: