写了一格从文件读入数据,用分隔符短句后,重新创建一个新文档输出。代码测试过,没有问题。可是运行时不通过……
请高手指点~!代码如下:
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"也没成功创建.请高手指点~~~!
请高手指点~!代码如下:
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"也没成功创建.请高手指点~~~!
你试一下!
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)来处理。
晕……
1楼,请不要看到尖括号就认为是泛型……
再说了,StringTokenize是GPSData.readData()内部所调用的,不是由楼主去操纵的。我坚持认为,最可能的原因是“JB+XJT.TXT”文件内部内容的问题。
问题出在 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, "(,)")很显然就报空指针异常了。
问题解决了~!
那如果,我需要预先知道JB+XJT.TXT有多少,再新建数组GPSData[];应该怎样做呢?
int n=in.readLine();readData方法,应该怎么改?
为了将功折罪,给楼主整理了一下代码,功能应该是可能实现,虽然过程不太合理……
代码如下(修改之处都用注释说明了……):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;
}