码厨frog 2017-05-18 11:22 采纳率: 0%
浏览 4414
已采纳

关于new Scanner 和 Scanner类 close()方法的问题

最近学习java遇到的问题,在网上找到了一个和我遇到一样问题但是仍没有解决的描述,于是直接把问题粘贴过来了:
在声明Scanner类的对象之后,如果后面的程序只是使用了这个对象的诸如x.nextInt()方法而没有其它语句,那么Eclipse编译器会报一个warning:Resource leak xxxxx is never closed.
在网上查了一下,需要调用.close()方法来关闭。添加这句后果然就不会报这个warning了。
但是后来又发现一个问题,调用x.close()后。就再也没有办法使用Scanner类的对象了。哪怕是再次new Scanner定义也不行,编译器会报错。
这个问题在方法内部也存在,比如定义了一个方法,方法里面定义了Scanner对象x(Scanner x = new Scanner()),之后正常输入和关闭(x.nextInt()... x.close())。然后自定义的这个方法执行完毕,跳回main方法,在main方法中就不能再定义或调用任何Scanner类型的对象了,否则会报错。
如果在自定义的方法里,不写x.close(),那么跳回main方法后,就还可以使用其它Scanner类型的对象。当然这样自定义方法里就会有一个上面提到的warning。
请问这个问题的原因和终极解决办法!!

下面是我做实验的代码:

package labpackage;

import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt());
        method1();
        Scanner sc2 = new Scanner(System.in);
        int i = sc2.nextInt();
        System.out.println(i);
        sc.close();

    }

    //一旦这里将sc关闭,方法执行完毕之后,会对主方法的sc产生影响
    public static void method1(){
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt());
        sc.close();
        System.out.println(sc.toString());
    }
}
  • 写回答

1条回答 默认 最新

  • 离水的鱼儿 2017-05-18 11:56
    关注

    1.第一个问题:
    sc2没有关闭这个流,当然这个不是你说的问题,是你代码存在的问题。
    2.第二说你的warning问题:
    在你使用sc2的时候你已经关闭了sc,所报的异常 是在这句代码 int i = sc2.nextInt();出现的 。
    标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
    这是官方文档对 system.in的解释(具体请查看API文档)
    他是一个_**static类型**_的 也就是 属于类属性 多个对象共同持有 你这个关闭等于其他对象也不能用了。这样讲你懂了吗?
    3.第三个问题:如果不想有warning 可以传递一个Scanner sc过来 具体代码如下:

     import java.util.Scanner;
    
    public class ScannerTest {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println(sc.nextInt());
            method1(sc);
    
            Scanner sc2 = new Scanner(System.in);
            int i = sc2.nextInt();
            System.out.println(i);
            sc.close();
            sc2.close();
    
        }
    
        //一旦这里将sc关闭,方法执行完毕之后,会对主方法的sc产生影响
        public static void method1(Scanner sc){
            //Scanner sc = new Scanner(System.in);
            System.out.println(sc.nextInt());
            //sc.close(); //不要在这里关闭,关闭了sc2就不能用了
            System.out.println(sc.toString());
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?