2016-12-23 61 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

我的构造函数看起来像这样;)但是当我发送一个乘客时,一切都很好。所以当我发送多个 - 最后一位乘客超越了先前的乘客 –