写了一格从文件读入数据,用分隔符短句后,重新创建一个新文档输出。代码测试过,没有问题。可是运行时不通过……
请高手指点~!代码如下:
import java.io.*;
import java.util.*;public class convert
{
  public static void main(String[] args)
  {
try{
BufferedReader in=new BufferedReader(new FileReader("JB+XJT.TXT"));
int n=150; GPSData[] data=new GPSData[n];
for(int i=0;i<150;i++)
{
   data[i]=new GPSData();
   data[i].readData(in);
} in.close(); PrintWriter out=new PrintWriter(new FileOutputStream("forGPS.txt")); for(int j=0;j<150;j++)
{   
    data[j].writeData(out);
}
out.close();
    }catch(IOException exception){
exception.printStackTrace();
    }
   }
}class GPSData
{
  public GPSData() {}  public GPSData(String t,Double la,Double lo)
  {
utc=t;
latitude=la;
longitude=lo;
  }  public void readData(BufferedReader in) 
  {
    try{
String s=in.readLine();
StringTokenizer t=new StringTokenizer(s,"(,)");
utc=t.nextToken();
latitude=Double.parseDouble(t.nextToken());
longitude=Double.parseDouble(t.nextToken());
   }catch(IOException exception){
exception.printStackTrace();
   }
  }  public void writeData(PrintWriter out) throws IOException
  {
out.println(latitude+","+longitude);
  }  public String toString()
  {
return utc+latitude+longitude;
  }  private String utc;
  private Double latitude;
  private Double longitude;
}编译通过,可运行时出现以下错误:
Exception in thread "main" java.lang.NullPointerException
        at java.util.StringTokenizer.<init>(Unknown Source)
        at java.util.StringTokenizer.<init>(Unknown Source)
        at GPSData.readData(convert.java:61)
        at convert.main(convert.java:16)
要创建的文件“forGPS.TXT"也没成功创建.请高手指点~~~!

解决方案 »

  1.   

    提示指针空指向。StringTokenize应该使用泛型就好了!
    你试一下!
      

  2.   

    从异常信息来看,导致异常的代码为:
    data[i].readData(in); 
    而 data[i] 刚刚初始化( data[i]=new GPSData();  ),不可能是NullPointer,所以问题很可能出在 in 上。
    而初始化 in 的代码为:
    BufferedReader in=new BufferedReader(new FileReader("JB+XJT.TXT"));
    再看异常信息中的 StringTokenizer,说明异常的产生还跟字符串的解析有关。于是,问题的可能性有两方面:
    1、文件名的问题。建议楼主换个文件名试试。
    2、文件中内容的问题。Reader是字符流,请楼主确认一下:文件中的内容是否都是有效字符?否则请换用字节流InputStream(FileInputStream)来处理。
      

  3.   


    晕……
    1楼,请不要看到尖括号就认为是泛型……
    再说了,StringTokenize是GPSData.readData()内部所调用的,不是由楼主去操纵的。我坚持认为,最可能的原因是“JB+XJT.TXT”文件内部内容的问题。
      

  4.   

    应该是JB+XJT.TXT文件名问题,换个不带符号的实验下
      

  5.   

    回楼主:
    问题出在 data[i].readData(in);上
    在readData(in)中
    有这么两句话:
                 String s = in.readLine();
        StringTokenizer t = new StringTokenizer(s, "(,)");
    楼上几位说什么文件名有问题,纯属扯淡
    请楼主注意检查下JB+XJT.TXT 行数是不是够150(因为你定义了i <150) 报空指针异常就是因为JB+XJT.TXT文件中行数 是不是不够150行(注意如果是空行会报NoSuchElementException,因此要保证每行都有数据),当程序运行到in.readLine()为空时,在去调用new StringTokenizer(s, "(,)")很显然就报空指针异常了。
      

  6.   

    谢谢,6楼~!
    问题解决了~!
    那如果,我需要预先知道JB+XJT.TXT有多少,再新建数组GPSData[];应该怎样做呢?
      

  7.   

    用readLine方法的返回内容来判断,同时修改一下GPSData的readData方法
      

  8.   

    如果用readLine方法来实现,代码是这样吗:
    int n=in.readLine();readData方法,应该怎么改?
      

  9.   

    我承认,之前我没有认真看题……(出怪事了,这可不是我的习惯啊!今儿个有点不在状态……)
    为了将功折罪,给楼主整理了一下代码,功能应该是可能实现,虽然过程不太合理……
    代码如下(修改之处都用注释说明了……):package test;import java.io.*;
    import java.util.*;public class Convert {
    public static void main(String[] args) {
    try {
    BufferedReader in = new BufferedReader(new FileReader("JB+XJT.TXT"));
    //因为文件大小未知,所以不要用数组,而要用集合
    //如果连集合也不想用,就可以用一个GPSData对象,边读边写
    //依楼主的意思,是想全部读出来之后再写,还是先使用集合写吧……
    ArrayList<GPSData> data = new ArrayList<GPSData>();
    while ( true ) {
    GPSData d = new GPSData();
    boolean ok = d.readData(in);
    if(ok)
    data.add(d);
    else
    break;
    }
    in.close(); PrintWriter out = new PrintWriter(new FileOutputStream("forGPS.txt"));
    for (int j = 0; j < data.size(); j++) {
    data.get(j).writeData(out);
    }
    out.close();
    } catch (IOException exception) {
    exception.printStackTrace();
    }
    }
    }class GPSData {
    public GPSData() {
    } public GPSData(String t, Double la, Double lo) {
    utc = t;
    latitude = la;
    longitude = lo;
    } //将返回值由void改为boolean,标识是否读取成功 
    //public void readData(BufferedReader in) {
    public boolean readData(BufferedReader in) {
    try {
    String s = in.readLine();
    if( s == null )
    {
    return false;
    }
    StringTokenizer t = new StringTokenizer(s, "(,)");
    utc = t.nextToken();
    latitude = Double.parseDouble(t.nextToken());
    longitude = Double.parseDouble(t.nextToken());
    return true;
    } catch (IOException exception) {
    exception.printStackTrace();
    return false;
    }
    } public void writeData(PrintWriter out) throws IOException {
    out.println(latitude + "," + longitude);
    } public String toString() {
    return utc + latitude + longitude;
    } private String utc;
    private Double latitude;
    private Double longitude;
    }