A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹文涛 黑马帝   /  2011-9-6 17:16  /  2207 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

要读取的文件中数据在存储格式为:name \t price \t num \n 一共有多行
请看这段代码:[code=java]import java.io.DataInputStream ;
import java.io.File ;
import java.io.FileInputStream ;
public class DataInputStreamDemo{
        public static void main(String args[]) throws Exception{        // 所有异常抛出
                DataInputStream dis = null ;                // 声明数据输入流对象
                File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径
                dis = new DataInputStream(new FileInputStream(f)) ;        // 实例化数据输入流对象
                String name = null ;        // 接收名称
                float price = 0.0f ;        // 接收价格
                int num = 0 ;        // 接收数量
                char temp[] = null ;        // 接收商品名称
                int len = 0 ;        // 保存读取数据的个数
                char c = 0 ;        // '\u0000'
                try{
                        while(true){
                                temp = new char[200] ;        // 开辟空间
                                len = 0 ;
                                while((c=dis.readChar())!='\t'){        // 接收内容
                                        temp[len] = c ;
                                        len ++ ;        // 读取长度加1
                                }
                                name = new String(temp,0,len) ;        // 将字符数组变为String
                                price = dis.readFloat() ;        // 读取价格
                                dis.readChar() ;        // 读取\t
                                num = dis.readInt() ;        // 读取int
                                dis.readChar() ;        // 读取\n
                                System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
                        }
                }catch(Exception e){}
                dis.close() ;
        }
};[/code]我明白它的读取过程  只是不懂 它是如何跳出while(true)循环的

评分

参与人数 1技术分 +1 收起 理由
王玉玺 + 1

查看全部评分

3 个回复

倒序浏览
看到这个问题,运行了一下,马上要意识到为什么最后的的System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;没有被打印出来,马上怀疑是异常退出,然后用System.out.println();语句在可疑的地方设立标志,最后发现程序进入了第二个while语句,但是没有出来,马上确定是异常,那么为什么异常没有被打印呢,马上找到catch语句,发现程序虽然try了异常,但是catch到后既然没有打印,这完全是不知trycatch异常的用处的表现,马上在catch语句中加入e.printStackTrace();语句,运行后异常马上打印出来如下:java.io.EOFException
        at java.io.DataInputStream.readChar(Unknown Source)
问题出在while((c=dis.readChar())!='\t')这个语句中,为什么出现这个异常就不说了。

这道题说明了一个问题,如果对不太了解的知识麻木使用,不仅对自身没有帮助,反而会越弄越糟,引出新问题,但也不排除不小心导致的,但是我觉得是一个必须小心的问题。
[ 本帖最后由 黄伟龙 于 2011-09-06  17:57 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
王玉玺 + 2

查看全部评分

回复 使用道具 举报
答案是:通过抛出异常来跳出while(true)循环的

在之前我们学过的知识中,我们知道
当一个流从通过read()方法读取到数据末尾的时候,会返回-1表示已经读取完毕
但是,如果通过readChar()来读取文件的话,由于文件中的内容不固定,那么当它返回什么字符的时候才算是读取完毕呢?
答案是:它会使用抛出EOFException这个异常的方式,来表示读到了文件的末尾
而EOFException的全称为End Of File Exception,也就是说,如果抛出了这个异常,就说明文件读取完毕
所以,你可以在catch(Exception e)这个语句块中调用e.printStackTrace()打印异常堆栈信息
这样你就可以看出程序是在执行哪一句的时候通过抛出这个异常来跳出循环的了

Tips:其实这个问题主要涉及到异常的应用问题
在咱们之前的开发中,我们总是认为异常就是错误,错误就是异常
所以我们一直在避免异常的发生,认为程序只有在不抛出异常的情况下才是最好的
但实际上,异常是Java中一个非常强大的工具,它的应用范围绝不仅仅是描述错误信息这么简单
记得我以前在学习的时候老师曾经说过一句话:对异常的使用,能够直接体现出一个人的技术水平
它可以用于控制流程、它可以用于提高代码可复用性、它可以用于提高代码安全性,它也可以制定代码的使用规范等
由于时间问题,现在只好先简单回答下,等我回家以后再做更详细一些的解释吧~
[ 本帖最后由 李叶 于 2011-09-06  18:10 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
王玉玺 + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-6 18:45:51
板凳
谢谢两位的回答,我大概了解了。原来异常不光是打印,提示错误信息的。以前我一直不明白异常有啥用,这回大概了解了一下,有空我就去研究研究! 谢谢了~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马