2017-10-15 131 views
0

所以我从.txt文件读取bikeParts的列表。这部分工作正常。麻烦的是我有一个while循环用于缓冲读取器,它应该检查下一行是否为空。该程序循环遍历.txt文件中的每个aprt,但随后尝试读取额外的“空”行。我很困惑,为什么程序没有退出while循环。不应该到达的split()上的空指针

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import java.util.*; 
import java.io.*; 
import java.nio.*; 

public class Main extends Application { 
    public static String read(String fileName) { 
     String success="success"; 
     String nope="not found"; 
     String IO="could not read file"; 

     File file = new File(fileName); 
     String line = null; 
     String[] fileNamer = fileName.split(".txt"); 
     String houseName = fileNamer[0].toString(); 
     try { 
      FileReader fr = new FileReader(file); 
      BufferedReader br = new BufferedReader(fr); 
      ArrayList<BikeParts> partList = new ArrayList<>(); 

      while ((line = br.readLine()) != null) { //the while loop in question 
       line = br.readLine(); 
       String[] elements = line.split(","); //null pointer on this line 
       partList.add(new BikeParts(elements[0], (elements[1]), Double.parseDouble(elements[2]), 
         Double.parseDouble(elements[3]), Boolean.parseBoolean(elements[4]), Integer.parseInt(elements[5]))); 
      }//BikeParts is a constructor for each part on the .txt file. makes a part object out of partName, partNumber, listPrice, salesPrice, onSale, and quantity 
      Warehouse house = new Warehouse(houseName, partList); //partList is the ArrayList of parts that is contained within the Warehouse that was just created by the user 
      return success; //debug return statement 
     } catch (FileNotFoundException e) { 
      return nope; //debug return statement 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return IO; //debug return statement 
     } 
    } 

    public void display() { 

    } 

    public void newPart(BikeParts p) { 
     MainWarehouse.add(p); 
    } 

    public void sortMainByName(MainWarehouse houseName) { 


    } 

    public void sortByNumber() { 

    } 

    public void addVan(String vanName, ArrayList<BikeParts> invName) { 
     //Vans.Vans(vanName,invName); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("GUI.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 800, 800)); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

.txt文件:

26inTube,1234567891,7.00,5.58,true,35 
10spFrontDerailer,1234567897,41.00,31.50,true,10 
seatPost,1234567892,17.00,1.23,true,5 
700-25SwhalbeTire,1234567895,51.00,40.50,true,10 
carbonHandleBars42cm,1234567893,47.00,5.58,true,3 
10spRearDerailuer,1234567896,82.00,70.50,true,10 
11spFrontDerailuer,1234567899,61.00,50.50,true,10 
WTB_saddle,1234567890,33.00,25.58,false,15 
mensBibsMedium,1234567900,110.00,99.00,false,4 
womensHelmetSmall,1234567901,130.00,79.00,false,4 
spdPedals,1234567902,62.31,79.00,true,4 
700-23SwhalbeTire,1234567894,51.00,40.50,true,10 
timePedals,1234567903,102.31,89.00,false,4 
frogPedalsTitanium,1234567904,142.31,130.00,false,4 
11spRearDerailuer,1234567898,97.00,80.50,true,10 
carbonWheelSet,1234567905,542.31,480.00,false,4 
mountainFork29,1234567912,223.00,195.00,false,4 
lynskeyTitaniumFrame265Med,1234567906,2542.99,1880.00,false,2 
grr,1234567907,4567.89,3456.78,false,2 
zarminComputer,1234567908,543.21,480.00,false,2 
womensBibsMedium,1234567909,110.00,99.00,false,4 
womensJacketMedium,1234567911,120.00,95.00,false,4 
mensJacketMedium,1234567910,120.00,95.00,false,4 

这是一个.FXML项目,所以有更多的类,但是这是目前唯一一个我有任何问题。为什么它经历了while循环?我在调试模式下运行程序,并在最后一次运行,line = null,这会导致分割调用上的空指针。但它不应该达到那个分割()

回答

2

那么没有编译你的代码我99.9%确定错误是在第二次readLine()调用,你的while条件是(line = br.readLine()) != null这意味着你正在阅读一行和你将其分配给变量行,然后检查该行是否为空。之后,出于某种原因,您正在阅读nextLine(),并且'放弃了'的上一行。所以,如果你从txt文件中读取最后一行,while条件将为true,并且您将再次从文件设置line = null中读取,因此尝试拆分空字符串将会给您一个空指针检查

为了解决您的问题,只需删除第二个readLine()调用

while ((line = br.readLine()) != null) { 
    String[] elements = line.split(","); 
    partList.add(new BikeParts(elements[0], (elements[1]), Double.parseDouble(elements[2]), 
      Double.parseDouble(elements[3]), Boolean.parseBoolean(elements[4]), Integer.parseInt(elements[5]))); 
} 
+0

伴侣你是一个救生员,非常感谢你。它做到了 –

+0

很高兴能够提供帮助,我们倾向于相信我们的代码能够像我们期望的那样工作,所以对于像这样的未来问题,只需在每行上插入一条打印语句以查看真正发生的事情 – JKostikiadis

+0

多数民众赞成我试图用调试模式,我只是没有做出我丢弃第一行的连接。我想我实际上并不知道while语句中的任务卡住了,我认为这只是一个条件测试 –