Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2863090
  • 博文数量: 178
  • 博客积分: 2076
  • 博客等级: 大尉
  • 技术积分: 2800
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-10 10:50
文章分类

全部博文(178)

文章存档

2010年(4)

2009年(13)

2008年(161)

我的朋友

分类: Java

2008-04-14 17:30:32

下面的程序,估计是字符串数组的问题。
求达人能帮忙看看
谢谢了

import java.io.*;
import java.util.StringTokenizer;
public class ReadFileTest
{
        //private String currentRecord = null;
        private String record = null;
    private String[] lineRecord = new String[4];
        private BufferedReader file;
        private String path;
        private StringTokenizer token;

    public static void main(String[] args)
    {
                ReadFileTest read = new ReadFileTest();
                read.setPath("aaaa.txt");
                while(read.nextRecord() != -1)
                {
                        System.out.println(read.returnRecord());
                }
        }

        //创建文件对象
        public   ReadFileTest()
        {
                file = new BufferedReader(new InputStreamReader(System.in),1);
        }
        public ReadFileTest(String filePath)throws FileNotFoundException
        {
                path = filePath;
                file = new BufferedReader(new FileReader(path));
        }
        //设置文件路径
        public void setPath(String filePath)
        {
                path = filePath;
    try{
                file = new BufferedReader(new FileReader(path));
        }catch(FileNotFoundException e){
                System.out.println("file not found");
        }
   }
   //得到文件路径
   public String getPath(){
           return path;
   }
   //关闭文件
   public void fileClose()throws IOException
   {
           file.close();
   }

   //读取下一行记录,若没有则返回-1
   public int nextRecord()
   {
           int returnInt = -1;
           try{
                   //while ((record = file.readLine()) != null)//只读入一行进缓冲区
                   //{
            record = file.readLine();
                           if(record.regionMatches(0,"Users of",0,8)==true)
                           {

                              int i=record.indexOf(":");
                              int j=record.lastIndexOf("of");
                              int k=record.indexOf("license");
                              int l=record.lastIndexOf("license");

                             lineRecord[0] = record.substring(9,i);
                             lineRecord[1] = record.substring(i+12,k);
                  lineRecord[2] = record.substring(j+2,l);
                     }
               //}

             }catch(IOException e)
           {
                   System.out.println("readLine problem.terminating.");
           }
           if(record == null)
           returnInt = -1;
           else
           {
                   token = new StringTokenizer(record);
                   returnInt = token.countTokens();
           }
           return returnInt;
   }
   //以字符串的形式返回整个记录
   public String[] returnRecord()
   {
           return lineRecord;
   }

}
编译没错,运行有错误:

Exception in thread "main" java.lang.NullPointerException
        at ReadFileTest.nextRecord(ReadFileTest.java:61)
        at ReadFileTest.main(ReadFileTest.java:17)







返回字符串数组的问题

你这个程序有好多问题,能跑起来还真的不容易呢。
可以拿来做个典型,好教育后人写程序要注意防范的错误。


从你的main开始讲起

CODE:
ReadFileTest read = new ReadFileTest();
read.setPath("aaaa.txt");
while (read.nextRecord() != -1) {
        System.out.println(read.returnRecord());
}

你创建了一个ReadFileTest的事例,我们来看看构建函数

CODE:
public ReadFileTest() {
        file = new BufferedReader(new InputStreamReader(System.in), 1);
}

这段代码是什么意思?完全没有任何意义,只是为了构建一个BufferedReader而应凑了一个reader出来,这样做不但没有任何帮助,而且浪费不必要的系统资源。没有什么事情可以干得时候可以让默认构建函数空着。

其二
read.setPath("aaaa.txt";我们看看这个setPath(String filename)做了什么

CODE:
path = filePath;
try {
        file = new BufferedReader(new FileReader(path));
} catch (FileNotFoundException e) {
        System.out.println("file not found");
}

这里做了一个try,似乎你了解文件可能不存在,但是你把错误在这里全部catch掉了,调用这个函数的程序并不知道你这里发生了Exception,所以当你的aaaa.txt不存在的时候,你的main里面会继续执行
while (read.nextRecord() != -1) { ...
下面的代码,所以这里也会报错。
正确的做法,应该在这里throw你的错误,使你程序停止执行。

CODE:
        public void setPath(String filePath) throws FileNotFoundException {
                path = filePath;
                file = new BufferedReader(new FileReader(path));
        }

把你的main改成

CODE:
                ReadFileTest read = new ReadFileTest();
                try {
                        read.setPath("aaaa.txt");
                        while (read.nextRecord() != -1) {
                                System.out.println(read.returnRecord());
                        }
                } catch (FileNotFoundException e) {
                        System.out.println("文件不存在");
                }

第三,我们来看看 public int nextRecord()

CODE:
// while ((record = file.readLine()) != null)//只读入一行进缓冲区
// {
record = file.readLine();
if (record.regionMatches(0, "Users of", 0, 8) == true) {

看看你自己注销的两行,你是从哪里copy来的吧?难道对你没有所启示吗?
既然是
while ((record = file.readLine()) != null)
就说明 file.readLine() 可能等于 null
如果record等于null,那么你再record.regionMatches 不报Null pointer exception 才怪!
正确的做法,应该确认record不等于null才能做其他事情

CODE:
                        record = file.readLine();
                        if (record == null)
                                returnInt = -1;
                        else {
                                token = new StringTokenizer(record);
                                returnInt = token.countTokens();
                               
                                if (record.regionMatches(0, "Users of", 0, 8) == true) {

                                        int i = record.indexOf(":");
                                        int j = record.lastIndexOf("of");
                                        int k = record.indexOf("license");
                                        int l = record.lastIndexOf("license");

                                        lineRecord[0] = record.substring(9, i);
                                        lineRecord[1] = record.substring(i + 12, k);
                                        lineRecord[2] = record.substring(j + 2, l);
                                }
                        }

最后,你没有判断String 到底有多长就substring,不出Exception才怪。
如果一个String 只有6位长 String str = "abcdef"  然后你 str.substring(9, x)就会导致 IndexOutOfBoundsException由于NullPointerException和 IndexOutOfBoundsException都是RuntimeException,和IOException之类的不同,不要求你写代码的时候 强制加try,所以出了问题更难捕捉。
lineRecord[] 的赋值,建议你好好学习正则表达式(Regular Expression),不要再写出这种无法运行又难以维护的程序来。

阅读(466) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~