JAVA_Program_Language:个人遇到的 java.util.NoSuchElementException 异常以及问题所咋与解决方法

下面是输出的异常信息

1
2
3
4
5
6
7
8
java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at User.Operator.main(Operator.java:71)
at User.Main.login(Main.java:63)
at User.Main.main(Main.java:18)

在正常的输出中,在函数结束的位置还有一句

1
Exception in thread "main"

索性让我们看看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public boolean downloadFile() throws SQLException, IOException{
try {
Scanner input = new Scanner(System.in);
System.out.print("输入文件编号:");
String fileID = input.next();
input.close();
Doc fileDoc = DataProcessing.searchDoc(fileID);

File initedFile = new File(this.uploadPath+fileDoc.getFilename());

File creatFile = new File(this.downloadPath+fileDoc.getFilename());
try {
creatFile.createNewFile();
} catch (IOException ioe){
System.out.println("下载目录出错(无法创建新文件)!");
throw ioe;
}

try {
FileInputStream fis = new FileInputStream(initedFile);
FileOutputStream fos = new FileOutputStream(creatFile);

byte [] temp = new byte[(int)initedFile.length()];
fis.read(temp);
fos.write(temp);
fis.close();
fos.close();
} catch (FileNotFoundException notFound) {
System.out.println("未找到文件!");
throw notFound;
} catch (IOException ioe) {
System.out.println("io接口错误!");
throw ioe;
}
System.out.println("下载文件... ...");
} catch (SQLException sqle) {
System.out.println("sqle");// 这句用于检查是否出错
throw sqle;
} catch (IOException ioe) {
System.out.println("ioe");// 同上
throw ioe;
}
System.out.println("下载文件成功!");
return true;
}

此方法用于上传文件,在main函数中使用方法如下:

1
2
3
4
5
6
7
8
9
10
case 3:
try {
this.downloadFile();
//System.out.println("到了这里");
} catch (SQLException sqle) {
System.out.println("发生错误:数据库异常("+sqle+")");
} catch (IOException ioe) {
System.out.println("发生错误:IO接口异常 ("+ioe+")");
}
break;

在测试过程中,各种用于标记完成的println()都输出了,也未有捕捉到异常。在查找资料的时候,在一个百度知道中找到了答案。引用:百度知道
在最佳回答中,答主说到了是Scanner对象重复使用close()方法导致的,但是在问题中题主和答主未有讨论清楚的是,这里两次使用close()方法分别是不同的Scanner对象,出现错误不应该。


解决方法:将语句

1
input.close();

删除即可。


我在写这篇博文的时候也是突然灵光一闪,意识到一个严重的问题。详细即为:
downloadFile()方法内使用的Scanner对象和main()方法内使用的Scanner对象,声明语句都为:

1
Scanner input = new Scanner(System.in);

即两个Scanner对象指向的内存都是命令行输入端,所以实际上两者是同一个对象(在JAVA虚拟机层面,而非软件中)。所以问题解决,原因找到,皆大欢喜!

Author: SmallXeon
Link: https://hexo.chensmallx.top/2018/06/13/javaprogramlanguage-personal-encountered-javautilnosuchelementexception-anomalies-and-problems-and-solutions/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
一些推广链接
几个便宜量大的小✈场: FASTLINK, YToo, 论坛邀请注册: ,
便宜量大但是稳定性不足的VPS: Virmach, 价格略贵但好用的VPN: , ,