• java的Scanner类的close()方法引来的故事


    java的Scanner类的close()方法--一个神奇的方法

      在学习Java学习中Scanner类是比较常用的类。殊不知,其中隐藏着大秘密。如不小心使用地它的close(),方法,便会酿成大错。如: java.util.NoSuchElementException。在向程序输入时一般这样,

    Scanner sc = new Scanner(System.in);
      声明一个Scanner对象。new Scanner(xxxx)-->括号里传入的时IuputStream类的对象。下面是用到的Scanner类的构造方法

     

      这就说明 system.in 得到的时IuputStream类的对象。事实也是如此,在System类里,in 是InputStream类型,并且是final,即常量,被初始化后就不能被改变了。

    Scanner sc = new Scanner(System.in);

      搞明白了Scanner对象创建原理那就上代码吧

    1   Scanner sc = new Scanner(System.in);
    2   String next = sc.next();
    3   //sc.close();
    4   Scanner aa = new Scanner(System.in);
    5   String next1 = aa.next();

      运行如上代码输入字符,回车,诶!好像没问题。但是你可能忘了一件重要的事情,IuputStream是一个流,在不用的时候需要关闭,如不关闭流,它是很消耗资源的。

      可能在学习的时候还没有甚麽大不了,当需要真正开发一个程序时,为了更好的优化程序,这就是很有必要的。于是放开了第3行的代码,让它关闭。再次愉快的输入,回车,惊喜发生了。

     

      解决方式在Scanner使用的最后才关闭流,这样既不会报错,也不会造成资源的浪费。当然最好时开启流和关闭流在同一个方法里,这样增大了代码的可读性,也提高了代码的不易错性。

      而且不多次new Scanner对象,虚拟机堆中的垃圾也会减少。如是想在其他方法里使用Scanner对象最好将该scanner对象当参数传进。

      代码场景:可能一般不会连着使用多个Scanner对象,但是有可能同一个方法里调用再多个方法而这些方法可能会用到Scanner对象。

      

      接下来重头戏登场。

      报错的原因:上面创建Scanner对象时,括号里的参数是 System.in  而in于是一个final类型,它一旦被初始化就不能改变。所以,不过你后面创建多少个Scanner类对象,其实都是返回同一个InputStream流。也就是说,每一次赋给新对象的地址是同一个

    一旦关闭流时,后面的对象所用的流就是关闭状态。惊喜就会产生!若是不注意可能写了很多代码后才报错,这样就很难找到真正的错误点。当然也可以通过反编译查看调用情况

      close()用时须谨慎!

  • 相关阅读:
    黄聪:基于jQuery+JSON的省市区三级地区联动
    黄聪:jquery 校验中国身份证号码
    黄聪: Bootstrap之Form表单验证神器: BootstrapValidator(转)
    黄聪:MySQL 按指定字段自定义列表排序
    黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法
    黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
    黄聪:解决丢失api-ms-win-crt-runtime-|1-1-0.dll的问题:vc_redist.x64
    黄聪:如何开启IIS7以上的“IIS6管理兼容性”
    黄聪:怎么清理win7、win8更新垃圾(winsxs目录清理)
    黄聪:Mysql5.6缓存命中率
  • 原文地址:https://www.cnblogs.com/caoshuiping/p/11286265.html
Copyright © 2020-2023  润新知