关于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;
}
正确吗? 展开
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;
}
正确吗? 展开
2个回答
展开全部
不close()会导致资源一直被占用,不是泄漏,其实小程序里几乎看不出来影响,但是每次输入的内容是在内存里的,一直不关闭很浪费资源,在java里良好的习惯是所有流用完后都要记得close()
System.in不会死,你关闭的只是标准输入流经过包装后的一个实例
这个和递归没必然关系,保证自己的逻辑没问题就行
System.in不会死,你关闭的只是标准输入流经过包装后的一个实例
这个和递归没必然关系,保证自己的逻辑没问题就行
追问
但是上述代码确实是错误的,此函数在第一次调用时正常,第二次调用时抛出java.util.NoSuchElementException异常。
如果去掉close语句则能运行,请问这是怎么回事呢。
追答
因为你关Scanner实例的时候System.in也关掉了,如果需要再用应该cin.reset();
你的Scanner最好定义为成员变量,不要用作局部变量,然后使用next读取的时候怎么递归循环都行,关闭也是在主方法中关,记得是完全使用完之后关闭,否则每次reset很麻烦
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询