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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面的代码是我根据毕老师讲的例子,写了一个函数myLoad(),实现与properties类的load()方法同样的功能,编译能通过,但执行时报错:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at propertiesDemo.myLoad(haha.java:21)
        at propertiesDemo.main(haha.java:9)
我查了好几遍,实在找不出错误来,大伙帮我看看。

import java.io.*;
import java.util.*;
class propertiesDemo
{
        public static void main(String[] args)  throws IOException
        {
                FileInputStream in=new FileInputStream("info.txt");
                Properties pr=new Properties();
                myLoad(pr,in);
                pr.list(System.out);
        }

        public static void myLoad(Properties pr,InputStream in) throws IOException
        {
                BufferedReader bufr=new BufferedReader(new InputStreamReader(in));
                String line;
                while((line=bufr.readLine())!=null)
                {
                       
                        String []str=line.split("=");
                        pr.put(str[0],str[1]);
                                       
                }
                bufr.close();
        }
}

5 个回复

正序浏览
姚鑫 发表于 2012-4-2 23:54
这个程序不用改为 String line = null;也是可以运行的。line=bufr.readLine()就是一个赋值。
例如程序:
pu ...

哥们,你说得对
数组角标越界原因确实是txt文档的原因,因为有几行没有等号。
我验证了下:没有等号的,会报错。空行的,报错。只有key,没有value的也报错。有value没有key的不报错。
另外,末尾有回车换行没事啊,没报错
回复 使用道具 举报
pr.put(str[0],str[1]);
这行代码有问题,你一次存两个,但你不能保证你切割出来的元素个数是偶数!一旦是奇数,那么你只能存到str[0],而str[1]不存在,那么自然会报角标越界异常
回复 使用道具 举报
田啸 发表于 2012-4-2 22:52
局部变量没有初始化的原因
第二十一行:  String line;
这里需要改为 String line = null;

哥们,line不需要赋null也可以的
回复 使用道具 举报
这个程序不用改为 String line = null;也是可以运行的。line=bufr.readLine()就是一个赋值。
例如程序:
public class Test {
        public static void main(String[] args) {
                int i;             // 不用定义为 int i = 0; 也是可以的
                i = new Random().nextInt(10);
                System.out.println(i);
        }
}
这个程序的问题应该在于info.txt这个文件的格式有问题
假如info.txt中有空行,那么此时line="", str的lenth==0,str[0]、str[1]不存在,会报数组越界异常;
假如info.txt中有的行只有key,没有value,str的lenth==1,str[1]不存在,会报数组越界异常;
假如info.txt中有的行没有等号,line无法分割,也会报数组越界异常;
所以请检查info.txt的格式,注意末尾不要有回车换行
也可以将程序改为
  1.         public static void myLoad(Properties pr, InputStream in) throws IOException {
  2.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(in));
  3.                 String line;
  4.                 while ((line = bufr.readLine()) != null) {
  5.             String []str=line.split("=");
  6.             if(str.length<2)
  7.                     continue;
  8.             pr.put(str[0],str[1]);
  9.                 }
  10.                 bufr.close();
  11.         }
复制代码
回复 使用道具 举报
本帖最后由 田啸 于 2012-4-3 07:50 编辑

可能是局部变量没有初始化的原因
第二十一行:  String line;
这里需要改为 String line = null;

如果是成员变量的话,系统会给他初始化,赋默认值,比如int为0,boolean类型为flase,String类型为null等。
但是如果是方法里面定义的局部的基本类型变量,系统不会给他赋值,在调用之前需要明确给他指定一个值.
也有可能是你txt文件中内容的格式不对,其中有某一行切割出来的数组只有一个元素

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马