在java中使用scanner类获取文件输入时出错

时间:2016-04-21 16:43:14

标签: java file-io

我想使用Java中的scanner类来从文件中获取输入。我想从文件中读取不同城市的两个坐标,然后将它们存储在ArrayListCity个对象中。

输入文件格式如下:

NAME : att48
COMMENT : 48 capitals of the US (Padberg/Rinaldi)
TYPE : TSP
DIMENSION : 5
EDGE_WEIGHT_TYPE : ATT
NODE_COORD_SECTION
1 6734 1453
2 2233 10
3 5530 1424
4 401 841
5 3082 1644

我的示例代码片段如下:TourManager是一个包含ArrayList City对象的类。我还没有在这里展示它。 City类包含城市的每个细节(x,y坐标)。

try 
    {
        Scanner in = new Scanner(new File("att48.tsp"));
        String line = "";
        int n;
        //three comment lines
        in.nextLine();
        in.nextLine();
        in.nextLine();
        //get n
        line = in.nextLine();
        line = line.substring(11).trim();
        n = Integer.parseInt(line);
                    City[] city= new City[n];
       for (int i = 0; i < n; i++) {
                    city[i].x=0;
                    city[i].y=0;
        }

        //two comment lines
        in.nextLine();
        in.nextLine();

        for (int i = 0; i < n; i++)
        {
            in.nextInt();
            city[i].x =  in.nextInt();
            city[i].y =  in.nextInt();
            TourManager.addCity(city[i]);
        }
    } 
    catch (Exception e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

但我得到的是NullPointerException

  city[i].x =  in.nextInt();

虽然我之前已将其初始化为0,但代码会抛出NullPointerException

为清楚起见,City类如下:

public class City {
    int x;
    int y;

  // Constructs a city at chosen x, y location
  public City(int x, int y){
    this.x = x;
    this.y = y;
  }
}

代码中是否有问题?

1 个答案:

答案 0 :(得分:0)

您收到错误是因为:

City[] city= new City[n];

您尚未为单个city[i]元素分配内存。

你必须做这样的事情,但为此你需要在你的城市类中添加一个默认构造函数,因为你之后分配了x和y:

for (i=0;i <n ;i++){
   city[i]= new City();     
}

City班级中添加以下构造函数:

public City(){

}

或者我建议你修改你的City课程:

public class City {
    private int x;
    private int y;

    // Constructs a city at chosen x, y location
    public City(int x, int y) {
        this.setX(x);
        this.setY(y);
    }

    public City() {

    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

}