关于java IO流异常抛出问题,跪求Java大神回答(我在线可以马上给分)

package a.b;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.RandomAccessFile;
publicclass Test3 {
publicstaticvoid main(String[] args) throws IOException {
File f = new File("config");
RandomAccessFile raf = new RandomAccessFile(f, "rw");
int count = 0;
try {
count = raf.readInt(); // 如果没有读取到信息,那么会产生异常
if (count < 5) {
count++;
System.out.println("当前是第" + count + "次试用");
raf.seek(0);
raf.writeInt(count);
} else {
System.out.println("试用次数已经结束");
}
} catch (IOException e) {
raf.writeInt(1);
System.out.println("当前是第" + 1 + "次试用");
}
}
}
上面readInt()方法如果没有读取到信息,那么会产生异常。
那么为什么下面read()方法如果没有读取到信息,也不产生异常?那么下面read()方法什么时候才会产生IO异常呢?(跪求java大神高手请问答这两个问号)
package a.b;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
publicclass B {
publicstaticvoid main(String[] args) {
FileReader fr=null;
try {
fr = new FileReader("c.txt");
} catch (FileNotFoundException e) {
System.out.println(88);
}
int a=0;
try {
fr.close();
a= fr.read();//为什么这里read()方法如果没有读取到信息,也不产生异常?
System.out.println(123);
System.out.println((char)a);
} catch (IOException e) {
System.out.println(456);
}
}
}
到目前为止下面所有回答都偏离我想要的答案
第一:我明白readint()在上面代码会产生异常,这个没得解释的,老师笔记就是这样描述的,至于为什么会产生就不用研究到底了这个1+1为什么等于二道理一样吧(还有上面第一个代码我完全理解,不要纠缠第一个代码了,写第一个代码出来是为了和下面那个代码中的read()做个对比而已)
我之前用read()方法都是将异常throws出去的 现在我需要在异常产生情况下分别在try块和catch块都相应执行一些自定义操作-----------因为不太了解read()什么时候会抛出异常,查了API的read()方法也没怎么描述,看了API---IOException这个类也没有我想要的答案,到目前为止百度了一个答案就是-----------如果read()方法前不小心把流关闭了就会产生异常(现在我想知道read()方法在什么时候会有异常产生)

如图所示,第一次因为你的文件内容是空的,已经达到末尾了,所以catch到的异常是EOFException,如下所示:

 

 

同学,好好看看API文档:

 

readInt当文件达到末尾的时候会抛出EOFException,而第一次你调用readInt文件肯定是在末尾,所以抛出了异常,而不是1+1等于2的道理。

追问

不要研究readInt()方法,
read()方法呢?

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-09-16
你将捕获的异常输出来就会看到异常信息了,而不是简单的System.out.println(456);追问

我那System.out.println(456);是为了测试是否产生异常 我都不知道什么情况下才产生异常 何来捕获 到目前为止我i只知道在read()方法前面把流关闭了就会产生异常 除了这种 read()方法什么情况下会产生异常

追答

你确定new FileReader("c.txt");对吗?连盘符都没有。

追问

我在工作区新建一个c.txt 盘符应该可以忽略吧

追答

你是web项目吗?个人觉得是路径有问题

public static String getRoot(){
//获取项目的根目录
String root = ServletActionContext.getServletContext().getRealPath("/");
//处理路径中的空格问题
root = root.replaceAll("%20", " ");

return root;
}

这个是获取项目根目录的代码,javaweb项目

追问

c.txt没错的 你就忽略这点吧 ---------你就把它当做是对的吧 ,直接研究read()方法什么时候会抛出异常

追答

fr.close();
a= fr.read();//为什么这里read()方法如果没有读取到信息,也不产生异常?

为什么是先close再read呢?顺序是不是错了?

追问

唉 我这是在网上看到的如果read()方法前不小心把流关闭了就会产生异常,-----你就把它当做这是总结read()产生异常情况之一吧 一般情况下哪个脑残关闭流再去调用read()----除了不小心

追答

......................................

相似回答