JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
基本概念
Java通過系統(tǒng)類System實現標準輸入/輸出的功能
通過實例化Scanner類的方式實現從鍵盤的數據輸入
問題描述
錯誤示例一:
import java.util.Scanner;public class CloseTest {public static void main(String[] args){Scanner in = new Scanner(System.in);int a = in.nextInt();System.out.println(a);in.close();Scanner in_2 = new Scanner(System.in);int b = in_2.nextInt();System.out.println(b);in_2.close();} }輸入1后的結果:1
Exception in thread "main" java.util.NoSuchElementExceptionat 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 test.CloseTest.main(CloseTest.java:13)錯誤示例二:?
?錯誤示例三:
19行的注釋去掉后運行時第22行就會報錯
問題分析
以錯誤示例一為例:
在創(chuàng)建Scanner類對象in后,實現了輸入,試圖調用close方法關閉輸入流,再創(chuàng)建一個新的Scanner對象,
在int b = in_2.nextInt();一句出現錯誤。
這是因為創(chuàng)建的in和in_2對象都是有System.in封裝而來的,雖然是兩個獨立的對象,但是用的是同一個輸入流
補充:System.in 而in于是一個final類型,它一旦被初始化就不能被改變。所以,不過你后面創(chuàng)建多少個Scanner類對象,其實都是返回同一個InputStream流。也就是說,每一次賦給新對象的地址是同一個。
在調用in.close()實際上相當于System.in.close()
對于創(chuàng)建的in_2來說,System.in已經被關閉了。
補充:Scanner類的close()方法會關閉其綁定的輸入流。
即:一旦關閉 System.in 流時,后面的對象所用的 System.in 流就是關閉狀態(tài)。而?System.in?一個final類型,無法獲取一個新的 System.in?流
驚喜就會產生!若是不注意可能寫了很多代碼后才報錯,這樣就很難找到真正的錯誤點。
當然也可以通過反編譯查看調用情況。
?對于錯誤示例三:console對象綁定的輸入流即?System.in ,但是?System.in 已經關閉,導致拋出異常。
解決方案
方法一:
在所有其他的類中不使用使用close()方法
然后在包含主函數的類中創(chuàng)建Scanner對象,在代碼的最后調用close()
?
參考文章
https://www.cnblogs.com/caoshuiping/p/11286265.html
https://blog.csdn.net/qq_35029061/article/details/85525157
https://blog.csdn.net/daiidai/article/details/80716312
http://www.imooc.com/wenda/detail/569103
https://blog.csdn.net/biao_suki/article/details/45357425
總結
以上是生活随笔為你收集整理的JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thymeleaf——在不覆盖现有cla
- 下一篇: Spring Boot + Mybati