import java.io.*;
import java.util.*;
import java.util.regex.*;public class J {
public static void main(String[] args) throws Exception {   String input = "F:/shiyan.txt";
  Pattern p = Pattern.compile("\\d+");
  List<Double> arr = new ArrayList<Double>();
  
  FileReader in = new FileReader(input);
  BufferedReader data = new BufferedReader(in);
  
  while (data.readLine() != null) {
  String str = data.readLine().trim();
System.out.println(str);//测试到底读了哪行
  Matcher m = p.matcher(str);
  while (m.find()) {
  arr.add(Double.parseDouble(m.group()));
  }
  }
    
  double[] inputArray = new double[arr.size()];   for (int i = 0; i < arr.size(); i++ ){
  inputArray[i] = arr.get(i);
  System.out.println(inputArray[i]);
  }
}
}    程序运行后,只显示偶数行的内容,为什么readLine()没有从第一行读。    为了简单的测试一下,我又加了句while (data.readLine() != null) {
System.out.println(data.readLine());
  String str = data.readLine().trim();
System.out.println(str);//测试到底读了哪行
  Matcher m = p.matcher(str);
  while (m.find()) {
  arr.add(Double.parseDouble(m.group()));
  }
  }    运行后抛出Exception in thread "main" java.lang.NullPointerException
        at J.main(J.java:19)    
    想了好长时间都没得要领,望达人解惑,不胜感激! 

解决方案 »

  1.   


    while (data.readLine() != null) {
              String str = data.readLine().trim();你在判断条件中已经读了一行,下面又调用readLine再读一行,这样你就只读偶数行了,哈哈。
      

  2.   

    1楼说的对,你运行了2个readLine肯定是读了2行的数据了,你处理的就是第二行的。你把String str = data.readLine().trim();放在while循环的起前面
     String str = data.readLine().trim();
     while (str != null) {        
        ...
    //在最后写一个 
        str = data.readLine().trim();
    }
    这样应该能解决你的问题了。你后来的时候改的一下子读了3行,这样肯定会报错了。
      

  3.   


    String str = data.readLine();
    while (str != null) {
              Matcher m = p.matcher(str);
              while (m.find()) {
                  arr.add(Double.parseDouble(m.group()));
              }
    }
         多谢朋友们的回答!
          改了一下,再次运行不动了,调出任务管理器一看,嚯,好家伙,CPU已经100%了,死循环么?
      

  4.   

         嘿,乌龙,仔细看了下,测试的代码,原来要写到循环语句里,难怪会死循环
    while ((str = data.readLine()) != null) {
    System.out.println(str);
              Matcher m = p.matcher(str);
              while (m.find()) {
                  arr.add(Double.parseDouble(m.group()));
              }
    }
      

  5.   

    for循环
    BufferedReader reader = ...;for(String text = reader.readLine(); text != null; text = reader.readLine()){
        process(text);
    }