在Java中读取文本文件时出错

时间:2011-12-09 01:18:54

标签: java file nullpointerexception

我必须从文件中读取,所以:

cod_order (int)
cod_cliente (int)
cod_pizza (int)
num_pizza (int)
cod_pizza
num_pizza
...
$FINE

这是一个例子:

1
1107
02
1
01
5
03
2
$FINE

我创建了这个方法来读取这个文本文件:

private void loadOrdini(String fname){

    try{

        BufferedReader reader = new BufferedReader(new FileReader(fname));

        String cod_ordine = reader.readLine();
        while(cod_ordine!=null){

            String cod_cliente=reader.readLine();

            Cliente cl=listaclienti.get(Integer.parseInt(cod_cliente));

            String cod_pizza=reader.readLine();
            while(!cod_pizza.equals("$FINE")){

                String n_pizze=reader.readLine();

                Ordine ord = new Ordine(Integer.parseInt(cod_pizza),Integer.parseInt(n_pizze));

                cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord);

                cod_pizza=reader.readLine();

            }

            cod_ordine=reader.readLine();
        }

    }
    catch(IOException ioe){

        ioe.printStackTrace();
    }

}

问题是方法加载到HashMap listaordini只有数字032,而之前的数字是不考虑的。为什么?

import java.util.*;

public class Cliente{

private String name;
private String address;

private Map<Integer,Ordine> listaordini;

public Cliente(String n,String addr){

    name=n;
    address=addr;

    listaordini=new HashMap<Integer,Ordine>();
}

public String getName(){

    return name;
}

public String getAddr(){

    return address;
}

public Map<Integer,Ordine> getListaOrdini(){

    return listaordini;
}

public String toString(){

    String temp="";

    temp+="Nome Cliente: "+name;
    temp+="\nIndirizzo: "+address;

    return temp;
}

}

即使在此之后,问题仍然存在相同

4 个答案:

答案 0 :(得分:3)

每次调用reader.readLine()时,您都会移动到文件的下一行。

因此,当你打电话

Cliente cl=listaclienti.get(Integer.parseInt(reader.readLine()));

当你打算解析1107时,你实际上是移动到下一行并获得02。

答案 1 :(得分:2)

我认为其他答案都忽略了这一点:您需要从订单ID到比萨饼的映射。

问题是,地图(例如HashMap)必须具有每个键的唯一映射。这意味着,您只能将单个 Ordine映射到订单ID,地图不支持为同一订单ID提供多个Ordine

有很多方法可以解决这个问题。您可以创建一个包含Orders列表的新对象并将其放入地图中,或者您可以更改地图以将订单ID映射到订单的List

例如,按照您的第二种方式进行:

// To create your map:
Map<Integer, List<Ordine>> listaordini = new HashMap<Integer, List<Ordine>>( );



// To add an order to it:
Ordine ord = new Ordine(Integer.parseInt(cod_pizza),Integer.parseInt(n_pizze));

List<Ordine> ordineList = cl.getListaOrdini( ).get(Integer.parseInt(cod_ordine));
if (ordineList == null)
{
    ordineList = new ArrayList<Ordine>( );
    cl.getListaOrdini( ).put(Integer.parseInt(cod_ordine), ordineList);
}

ordineList.add(ord);

答案 2 :(得分:0)

你曾多次致电readLine()

    String cod_ordine = reader.readLine();
    while(cod_ordine!=null){

        String cod_cliente=reader.readLine();

        Cliente cl=listaclienti.get(Integer.parseInt(reader.readLine()));

您使用第一次cod_ordine电话填充readLine()

您使用第二次cod_cliente电话填充readLine()

使用第三次 readLine()调用创建客户端对象 - 使用作为客户端值的cod_pizza值。

试试这个:

    String cod_ordine = reader.readLine();
    while(cod_ordine!=null){

        String cod_cliente=reader.readLine();

        Cliente cl=listaclienti.get(Integer.parseInt(cod_cliente));

答案 3 :(得分:0)

cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord);

因为您放入此地图的所有值都使用相同的密钥,即cod_ordine,因此每次调用此方法时,都会将旧ordine替换为新密码,这就是为什么您只需要有最后的记录。