下面是输出的异常信息
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(); } catch (SQLException sqle) { System.out.println("发生错误:数据库异常(" +sqle+")" ); } catch (IOException ioe) { System.out.println("发生错误:IO接口异常 (" +ioe+")" ); } break ;
在测试过程中,各种用于标记完成的println()都输出了,也未有捕捉到异常。在查找资料的时候,在一个百度知道中找到了答案。引用:百度知道 在最佳回答中,答主说到了是Scanner
对象重复使用close()
方法导致的,但是在问题中题主和答主未有讨论清楚的是,这里两次使用close()
方法分别是不同的Scanner
对象,出现错误不应该。
解决方法:将语句
删除即可。
我在写这篇博文的时候也是突然灵光一闪,意识到一个严重的问题。详细即为: 在downloadFile()
方法内使用的Scanner
对象和main()
方法内使用的Scanner
对象,声明语句都为:
1 Scanner input = new Scanner (System.in);
即两个Scanner
对象指向的内存都是命令行输入端,所以实际上两者是同一个对象(在JAVA虚拟机层面,而非软件中)。所以问题解决,原因找到,皆大欢喜!