关于Java从标准输入流读取数据的问题

我现在的实现方法是java.util.Scannercin=newjava.util.Scanner(System.in);//Readdatafromstandardi... 我现在的实现方法是
java.util.Scanner cin=new java.util.Scanner(System.in);
//Read data from standard in stream.
int i = cin.nextInt();
//Close Scanner
cin.close();//*********************
//Other operations.
return;

我就想知道,如果去掉加星的一行,IDE提示我资源泄露,这要紧吗?
在C++里设计良好的类都有完整的析构函数,像这样分配到栈里的对象都能及时正确析构,如果类的设计者在类的析构函数中写下了释放资源的代码,就无需客户代码显示释放资源了。
java好像不常有析构函数(因为垃圾收集),但这种close()没写真的会导致资源泄露吗?
如果System.in是标准输入流,那么close()会影响到它吗?
如果这些代码出现在某个递归函数中,会出现什么难以看到的问题吗?
C++转型Java新手,一些奇怪的问题还请海涵~
例如

private int GetInteger() {
Scanner cin = new Scanner(System.in);
boolean Loop = false;
int Temp;
do
try {
Loop=false;
Temp=cin.nextInt();
}
catch(InputMismatchException Exc)
{
Loop=true;
}
while(Loop);
cin.close();
return Temp;
}
正确吗?
展开
 我来答
oliverpp
推荐于2016-07-30 · TA获得超过988个赞
知道小有建树答主
回答量:686
采纳率:0%
帮助的人:641万
展开全部
不close()会导致资源一直被占用,不是泄漏,其实小程序里几乎看不出来影响,但是每次输入的内容是在内存里的,一直不关闭很浪费资源,在java里良好的习惯是所有流用完后都要记得close()
System.in不会死,你关闭的只是标准输入流经过包装后的一个实例
这个和递归没必然关系,保证自己的逻辑没问题就行
追问
但是上述代码确实是错误的,此函数在第一次调用时正常,第二次调用时抛出java.util.NoSuchElementException异常。
如果去掉close语句则能运行,请问这是怎么回事呢。
追答
因为你关Scanner实例的时候System.in也关掉了,如果需要再用应该cin.reset();
你的Scanner最好定义为成员变量,不要用作局部变量,然后使用next读取的时候怎么递归循环都行,关闭也是在主方法中关,记得是完全使用完之后关闭,否则每次reset很麻烦
love网店专员
2013-07-07 · TA获得超过357个赞
知道小有建树答主
回答量:775
采纳率:84%
帮助的人:116万
展开全部
操作的资源最好关闭,运行时间长了,会带来内存不够使用。
追问
这个道理我完全明白。

我想知道的就是Scanner的close()会不会影响到System.in
前几天才接触到java,什么都不懂,请讲清楚一点,谢谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式