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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于XINCHENG 中级黑马   /  2013-8-6 17:46  /  1541 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于XINCHENG 于 2013-8-6 23:32 编辑

请问在我测试IO流的缓冲方法时,故意不关联缓冲字节数组,结果第三个for循环出现了图片上的问题,为什么?谢谢了!!!

IO流问题截图-1.png (14.9 KB, 下载次数: 19)

我的file文件内容为一个数字3

我的file文件内容为一个数字3

IO流问题截图-2.png (28.06 KB, 下载次数: 23)

IO流问题截图-2.png

IO流问题截图-3.png (10.07 KB, 下载次数: 24)

第三个for循环所出现的问题

第三个for循环所出现的问题

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

7 个回复

倒序浏览
很明显是数组角标越界异常!
回复 使用道具 举报
本帖最后由 小发 于 2013-8-6 20:02 编辑

很明显是数组角标越界异常!

int len=fis.read();//    read()方法   -------返回下一个数据字节;如果已到达文件末尾,则返回 -1。
所以此时的len的值应该是文件中第一个数据ASCII码值而这个值可能大于8

因为你说,你的文件内容为一个数字3,我做了实验。
  1. public class Test6 {
  2.         static String filename="lib/a.txt";
  3.         static File file=new File(filename);
  4.         public static void main(String[] args) throws Exception {
  5.                 read();
  6.         }
  7.         public static void read() throws Exception{
  8.                 FileInputStream fis=new FileInputStream(file);
  9.                 int len=fis.read();
  10.                 System.out.println(len);
  11.         }
  12. }
复制代码
得到 len=51
而你设置的数组长度为8,所以肯定就数组角标越界了。

回复 使用道具 举报
你好,这个地方首先往缓冲数组byt中读数据,数据会装到byt数组中。
看了半天貌似没看出什么错误;我觉得唯一一处可能的就是你往数组中读入数据时把那句话注释了;
len = fis.read();     此时返回的是下一个数据字节,它可能大于8,也就是说这时len和你的数组byt没关系,所以当访问byt数组中脚标大于等于八的会出先角标越界异常。
个人见解,不知道是否对,共同学习
回复 使用道具 举报
小发 发表于 2013-8-6 18:55
很明显是数组角标越界异常!

int len=fis.read();//    read()方法   -------返回下一个数据字节;如果已 ...

是脚标越界异常应该没错,但是 len = fis.read(); 命令执行一次所得到的的结果并不能判断是脚标越界异常,你的代码里得到的51是对应的码制和byte数组没有关系。
回复 使用道具 举报
本帖最后由 小发 于 2013-8-6 22:03 编辑
于XINCHENG 发表于 2013-8-6 21:24
是脚标越界异常应该没错,但是 len = fis.read(); 命令执行一次所得到的的结果并不能判断是脚标越界异常 ...

为什么没关系呢?
你的for循环里面用到了len的值啊!!
你分析下面程序的结果,但循环到  i=9时就出现了角标越界。
然后你把byte [] b=new byte[8]; 改为byte [] b=new byte[51];
看程序还报错不。
  1. public class Test6 {
  2.         static String filename="lib/a.txt";
  3.         static File file=new File(filename);
  4.         public static void main(String[] args) throws Exception {
  5.                 read();
  6.         }
  7.         public static void read() throws Exception{
  8.                 FileInputStream fis=new FileInputStream(file);
  9.                 byte [] b=new byte[8];
  10.                 int len=fis.read();
  11.                 System.out.println(len);
  12.                 for(int i=0;i<len;i++){
  13.                         System.out.println("i="+i);
  14.                         System.out.println(b[i]);
  15.                 }
  16.         }
  17. }
复制代码
回复 使用道具 举报
小发 发表于 2013-8-6 21:59
为什么没关系呢?
你的for循环里面用到了len的值啊!!
你分析下面程序的结果,但循环到  i=9时就出现了角 ...

嗯,很有道理,谢谢啊!
回复 使用道具 举报
于XINCHENG 发表于 2013-8-6 22:12
嗯,很有道理,谢谢啊!

不客气,共勉!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马