有这样一个需求:
系统初始化时,读配置文件config,配置文件的内容如下:
[河北]
石家庄 11
保定 12
秦皇岛 13
[四川]
德阳 21
成都 22
绵阳 23
雅安 24
[新疆]
乌鲁木齐 31
……………………………………config中的内容按[**]分小节。随着需要,config中的小节会进行增删,每个小节的记录数也不定,也会随需要进行增删。也就是说,config中后来可能添上[内蒙古],而现有的[四川]下面,可能添加”遂宁 25“这样的记录进去。
现在偶有个需求,就是系统初始化时,读config文件,根据读到的[]生成数量不定的地域名数组province,根据每小节下的记录,生成数量不定的类数组branch,程序如下:类的定义:
public class Branch {
   public String Bname;
   public String Branno;
   public long count;
   public double sum;
Branch(){
    count=0;sum=0.0;
}
}系统初始化部分代码:
1        InputStreamReader fr  = new InputStreamReader(new FileInputStream(System.getProperty("user.dir") + "\\config"));
2          BufferedReader br=new BufferedReader(fr);
3          String province[];Branch array[][];
4          String midarr[],midstr;int i=0,j=0;
5          while((midstr=br.readLine())!=null){
6              midarr=midstr.split(" ");
7              if(midarr[0].charAt(0)=='[')
8              {province[i]=midarr[0].replace("[","");
9              province[i]=province[i].replace("]","");
10             i++;j=0;continue;
11              }
12              array[i][j].Bname=midarr[0].trim();array[i][j].Branno=midarr[1].trim();j++;
13              System.out.println(i+"\t"+j+"\t"+array[i][j]+"\t"+array[i][j]);
              
          }为什么编译时在第8、12行报错:java.lang.NullPointerException该怎么修改呢?

解决方案 »

  1.   


    InputStreamReader fr  = new InputStreamReader(new FileInputStream(System.getProperty("user.dir") + "\\config")); 
    2          BufferedReader br=new BufferedReader(fr); 
    3          String province[];Branch array[][]; 
    4          String midarr[],midstr;int i=0,j=0; 
    5          while((midstr=br.readLine())!=null){ 
    6              midarr=midstr.split(" "); 
    7              if(midarr[0].charAt(0)=='[') //midarr没有初始化,即midarr=new String[xx]
    8              {province[i]=midarr[0].replace("[",""); //province没有初始化,即province=new String[xx]
    9              province[i]=province[i].replace("]",""); 
    10            i++;j=0;continue; 
    11              } 
    12              array[i][j].Bname=midarr[0].trim();array[i][j].Branno=midarr[1].trim();j++; //array没有初始化
    13              System.out.println(i+"\t"+j+"\t"+array[i][j]+"\t"+array[i][j]); 
                  
              } 
    LZ用Map<String, List<String>>可能会更好一些,因为一开始并不知道数组的长度
      

  2.   

    7              if(midarr[0].charAt(0)=='[') 
    这一行可以不初始化,能够通过,偶曾经也在其他地方用过。但province和array 数组却不能这么用呢
      

  3.   

    那不是因为没初始化,而是midarr=midstr.split(" "); 这里赋值了,对象或数组没初始化就用肯定错,因为内存还没分配
    用Map和集合最简单了,因为你不知道你的数组的长度,当然,你每次重新new一个数组增加长度也可以
    大概看了一下你的程序,你的循环也有问题,计算你的数组都new了,你的i++先被执行了,最后的array[0][x]是没有值得
    在你的基础上用集合帮你改了一下,还有,你这样解析文件,你要严格保证你的文件格式,否则也会出错InputStreamReader fr  = new InputStreamReader(new FileInputStream(System.getProperty("user.dir") + "\\config")); 
    2          BufferedReader br=new BufferedReader(fr); 
    3          List<String> province=new ArrayList<String>();List<Branch> branch = new ArrayList<Branch>(); 
    4          String midarr[],midstr;int i=0,j=0; 
    5          while((midstr=br.readLine())!=null){ 
    6              midarr=midstr.split(" "); 
    7              if(midarr[0].charAt(0)=='[') 
    8              {String tmp=midarr[0].replace("[",""); 
    9              temp=tmp.replace("]",""); 
    10             i++;j=0;continue; 
    11              } 
    12              Branch b = new Branch();b.Bname=midarr[0].trim();b.Branno=midarr[1].trim(); 
    13              System.out.println(i+"\t"+j+"\t"+b.Bname+"\t"+b.Branno); branch.add(b);
                  
              }