黑马程序员技术交流社区
标题:
流关闭出现异常求解
[打印本页]
作者:
王鹏伟
时间:
2013-2-25 21:37
标题:
流关闭出现异常求解
public class Demo8 {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String readLine = br.readLine();
System.out.println(readLine);
br.close();
}
}
}
复制代码
为什么循环一次后会发生Stream closed 流已关闭的异常?
作者:
罗海云
时间:
2013-2-25 21:58
本帖最后由 罗海云 于 2013-2-25 22:07 编辑
package com.itheima.day01;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.*;
class test
{
public static void main(String[] args) throws Exception
{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 10; i++) {
String readLine = br.readLine();
System.out.println(readLine);
}
br.close();
}
}
这样就行了.
作者:
黄杨
时间:
2013-2-25 22:29
你这样做目的何在?一般都是用while循环来判断缓冲区里面有没有东西然后进行操作,像这样用for来做有什么特别的好处?
作者:
陈科宇
时间:
2013-2-25 22:42
朋友,你这样写的程序太那啥了。怎么可以循环地创建那么多的对象。
作者:
陈科宇
时间:
2013-2-25 23:53
public class Demo8 {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String readLine = br.readLine();
System.out.println(readLine);
/*
* 朋友,首先得说,程序这样说,实在是不能被接收的。重复创建了太多的BufferedReader对象,
* 大大增加了不必要的内存开销。你循环一次后出现Stream Closed是因为你的键盘输入流已经关闭,
* 只有下次启动程序时才能打开。程序的优化楼上忧伤写出了,你好好看看。而且应该处理异常,你也
* 没有做,视频里有例子,好好参照一下。
*/
br.close();
}
}
}
作者:
陈科宇
时间:
2013-2-25 23:55
public class Demo8 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String readLine = br.readLine();
System.out.println(readLine);
br.close();
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
String readLine1 = br.readLine();
System.out.println(readLine1);
br1.close();
/*
* 看了这个例子你就会更明白了。这会报一样的错误。
*/
}
}
复制代码
作者:
Benwolf0818
时间:
2013-2-26 11:25
public class Demo8 {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String readLine = br.readLine();
System.out.println(readLine);
}
br.close();
}
}
作者:
何伟
时间:
2013-2-26 14:47
public class Demo8 {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String readLine = br.readLine();
System.out.println(readLine);
// br.close();//在这里br都关闭了孩子们循环啊吧
}
br.close(); //循环完在关就可以了
}
}
作者:
赵家阳
时间:
2013-2-26 18:38
import java.io.*;
public class Demo8 {
public static void main(String[] args) throws IOException
{
BufferedReader br = null;
try{
br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null)
{
if("over".equals(line)) //如果输入over,就结束。
break;
System.out.println(line.toUpperCase());
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally{ //必定会运行,一定会结束。
br.close();
}
}
}
复制代码
首先,你这样的写法却是很有“新意”,在循环里面,你每一次都new了一个BufferedReader对象,但是循环结束时已经关闭了,而且下次循环时又new了一个新的BufferedReader对象,如果这么理解的话,应该是没有错的。但出异常了,这个我也回答不了。但是我不推荐你这样写,原因如下:
1,把BufferedReader放到循环里面,这样你要创建多少对象?这是很浪费资源的。即便你每一次都关闭了,这也有点不划算。将BufferedReader放到循环外面,即省资源,又达到目的,一举两得。那么此时也必须把close()放到循环外面。
2,其次,不应该用for循环。for循环在此处不能判断程序到什么时候结束(固定的次数有些不便),不易控制循环。如果要实现结束的话,还要在循环里面继续添加代码,会降低效率。但是,readLine();对于直接从键盘录入的话,不能直接靠默认的结束符来结束来结束循环。所以还要考自定义结束符(见上)来实现结束。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2