JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
基本概念
Java通過系統(tǒng)類System實(shí)現(xiàn)標(biāo)準(zhǔn)輸入/輸出的功能
通過實(shí)例化Scanner類的方式實(shí)現(xiàn)從鍵盤的數(shù)據(jù)輸入
問題描述
錯(cuò)誤示例一:
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后的結(jié)果: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)錯(cuò)誤示例二:?
?錯(cuò)誤示例三:
19行的注釋去掉后運(yùn)行時(shí)第22行就會報(bào)錯(cuò)
問題分析
以錯(cuò)誤示例一為例:
在創(chuàng)建Scanner類對象in后,實(shí)現(xiàn)了輸入,試圖調(diào)用close方法關(guān)閉輸入流,再創(chuàng)建一個(gè)新的Scanner對象,
在int b = in_2.nextInt();一句出現(xiàn)錯(cuò)誤。
這是因?yàn)閯?chuàng)建的in和in_2對象都是有System.in封裝而來的,雖然是兩個(gè)獨(dú)立的對象,但是用的是同一個(gè)輸入流
補(bǔ)充:System.in 而in于是一個(gè)final類型,它一旦被初始化就不能被改變。所以,不過你后面創(chuàng)建多少個(gè)Scanner類對象,其實(shí)都是返回同一個(gè)InputStream流。也就是說,每一次賦給新對象的地址是同一個(gè)。
在調(diào)用in.close()實(shí)際上相當(dāng)于System.in.close()
對于創(chuàng)建的in_2來說,System.in已經(jīng)被關(guān)閉了。
補(bǔ)充:Scanner類的close()方法會關(guān)閉其綁定的輸入流。
即:一旦關(guān)閉 System.in 流時(shí),后面的對象所用的 System.in 流就是關(guān)閉狀態(tài)。而?System.in?一個(gè)final類型,無法獲取一個(gè)新的 System.in?流
驚喜就會產(chǎn)生!若是不注意可能寫了很多代碼后才報(bào)錯(cuò),這樣就很難找到真正的錯(cuò)誤點(diǎn)。
當(dāng)然也可以通過反編譯查看調(diào)用情況。
?對于錯(cuò)誤示例三:console對象綁定的輸入流即?System.in ,但是?System.in 已經(jīng)關(guān)閉,導(dǎo)致拋出異常。
解決方案
方法一:
在所有其他的類中不使用使用close()方法
然后在包含主函數(shù)的類中創(chuàng)建Scanner對象,在代碼的最后調(diào)用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
總結(jié)
以上是生活随笔為你收集整理的JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thymeleaf——在不覆盖现有cla
- 下一篇: JAVA——开启多线程的方法汇总