2016-12-23 66 views
0

中以前的行的值有一個很快的問題。java從文件中讀取。最後一行覆蓋列表

我有一個文件名1.txt

Coupe 1 2 
Coupe 3 4 

和我有一個代碼

br = new BufferedReader(new FileReader("1.txt")); 
String tmp = ""; 
while ((tmp = br.readLine()) != null) { 
String[] s = tmp.split("\\s"); 
comfortName = s[0]; 
tickets = Integer.parseInt(br.readLine()); 
baggage = Integer.parseInt(br.readLine()); 
// next code send to constructor of class from value of comfort name a parametrs. 
Class[] e = new Class[]{Integer.TYPE,Integer.TYPE}; 
comfortName = "second.objects.carriages.type." + comfortName; 
Class carriageClass = Class.forName(comfortName); Constructor constructor = carriageClass.getDeclaredConstructor(e); 
passenger = (Passenger) constructor.newInstance((tickets),(baggage)); 
// the next line add to list a value from constructor 
carriage.addPassenger(passenger); 

添加客運代碼:

public boolean addPassenger(Passenger passenger) { 
     totalPassenger +=Passenger.getTickets(); 
     totalBaggage+=Passenger.getBaggage(); 
     return Carriage.getPassengerList() .add(passenger); 
    } 

所以結果時,我把它列出有這樣的事情:

Coupe 3 4 
Coupe 3 4 

但是從調試器中我發現數值讀取不錯。但總是最後一行 覆蓋列表中前面幾行的值。 因此,當我只發送一個排它的工作

+0

int tickets = Integer.parseInt(br.readLine()); \t \t int baggage = Integer.parseInt(br.readLine());應該拋出一個NumberFormatException – Shek

+0

是的,我做了一個嘗試捕獲,但對於這個問題,以最小的代碼,我已經刪除它 –

+0

java.lang.Class.newInstance()創建由此Class對象表示的類的新實例。該類被實例化,就像通過一個帶有空參數列表的新表達式一樣。如果該類尚未初始化,則該類將被初始化。 – Shek

回答

0

你在你的代碼

一個錯字,我相信你應該從分裂陣列

tickets = Integer.parseInt(s[1]); 
baggage = Integer.parseInt(s[2]); 

而不是讀取下一行獲得ticketsbaggage,下面會拋出異常

tickets = Integer.parseInt(br.readLine()); 
baggage = Integer.parseInt(br.readLine()); 
+0

Integer.parseInt(br.readLine());甚至不應該工作:) – Shek

+0

是的,它會拋出異常 – Saravana

0

java.lang.Class.newInstance()創建一個新的cl實例由此Class對象表示的屁股。該類被實例化,就像通過一個帶有空參數列表的新表達式一樣。如果該類尚未初始化,則該類將被初始化。

此示例代碼適用於我。

公共靜態無效的主要(字串[] args)拋出NumberFormatException的,IOException異常{

BufferedReader br = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/src/1.txt")); 
String tmp = ""; 
while ((tmp = br.readLine()) != null) { 
    String[] s = tmp.split("\\s+"); 
    String comfortName = s[0]; 
    int tickets = Integer.parseInt(s[1]); 
    int baggage = Integer.parseInt(s[2]); 
    System.out.println(comfortName + tickets + baggage); 

} 
br.close(); 

}

在控制檯上:

Coupe12 
Coupe34 
+0

這是trows ArrayIndexOutOfBoundsException。當我發送到該類的控制檯值時,我發送的示例。但是當我發送它列出最後一行覆蓋列表 –

+0

中以前的行的值你沒有創建一個新的類構造函數的實例嗎? – Shek

+0

檢查你的文件中的數據,行應該能夠分成三個子字符串,給出適當的空間給ArrayIndexOutOfBoundsException – Shek

0

檢查您創建實例的客運構造。

passenger = (Passenger) constructor.newInstance((tickets),(baggage)); 

問題在於你的構造函數。如果你的構造函數創建Passenger對象的新實例,它會沒事的。你的構造函數應該是這樣的:

private Passenger(int tickets, int baggage){ 
    this.tickets = tickets; 
    this.baggage = baggage; 
} 
+1

我的構造函數看起來像這樣;)但是當我發送一個乘客時,一切都很好。所以當我發送多個 - 最後一位乘客超越了先前的乘客 –