0

私は、クラスシミュレーター、駅、電車、ルート、乗客を使って鉄道シミュレーターを構築しています。ルートオブジェクトをパラメータとしてtrainオブジェクトに渡すことに問題があります-それはnullとして表示され続けます。問題を説明するための最良の方法として、コードを含めました。

import java.util.ArrayList;

public class Simulator {
int numStations;    
Route route1;
ArrayList<Station> stations;
ArrayList<Train> trains;
Route[] routes;

public static void main(String[] args) {

    //set up network
    Simulator sim = new Simulator();                
    ArrayList<Station> stations = new ArrayList<Station>();
    stations = sim.generateStations();
    Route[] routes;
    routes = sim.generateRoutes(stations);
    System.out.println("Route array " + routes);
    ArrayList<Train> trains = new ArrayList<Train>();
    trains = sim.generateTrains(routes);

    //start simulator
    sim.generatePassengers(stations);
    Train currentTrain = trains.get(0);
    System.out.println("current train " + currentTrain);
    //route null here
    System.out.println("Route of current train " + currentTrain.route);


}


public Route[] generateRoutes(ArrayList<Station> stations){
    //initialise routes between stations

    Station[] stationList1 = {stations.get(0), stations.get(1), stations.get(2), stations.get(3), stations.get(4), stations.get(5)};
    int[] stationDist1 = {200,100,200,300,200,300};
    Route route1 = new Route(true, stationList1, stationDist1);
    System.out.println("route1 " + route1);

    //make list of all routes
    Route[] routeList;  
    routeList = new Route[1];
    routeList[0] = route1;

    return routeList;
}

public ArrayList<Train> generateTrains(Route[] routes){
    //initialise trains
    ArrayList<Train> trainList = new ArrayList<Train>();
    trainList.add(new Train(routes[0], 100, 0, true, 5));
    trainList.add(new Train(routes[0], 100, 4, false, 10));

    System.out.println("first train in list " + trainList.get(0));
    System.out.println("first route in array " + routes[0]);
    //route is null here
    System.out.println("route of first train " + (trainList.get(0)).route);

    return trainList;
}
}

これが私の出力です:

route1 Route @ addbf1

ルート配列[LRoute;@42e816

配列Route@addbf1のRoute1

リストの最初の列車Train@190d11

配列Route@addbf1の最初のルート

最初の列車のルートnull

現在の電車Train@190d11

現在の列車のルートはnull

誰かが私がどこで間違っているのか説明できますか?

編集:列車クラス宣言:

public class Train {
Route route;
int capacity;
int recentLoc;
boolean forwards;
boolean atStation;
int speed;
Train currentTrain;
int timeAtStation;

//train constructor
public Train(Route r, int c, int i, boolean f, int s){
    r = route;
    c = capacity;
    i = recentLoc;
    f = forwards;
    s = speed;
    atStation = true;
    timeAtStation = 0;
}
4

5 に答える 5

2

インスタンス変数に値を割り当てていません。オブジェクトのデフォルト値はnullです。Trainコンストラクター内で「r=route」を「route=r」に変更します(他のすべてのフィールドでも同じです)。

public class Train {
Route route;
int capacity;
int recentLoc;
boolean forwards;
boolean atStation;
int speed;
Train currentTrain;
int timeAtStation;

//train constructor
public Train(Route r, int c, int i, boolean f, int s){
    route = r;
    capacity = c;
    recentLoc = i;
    forwards = f;
    speed = s;
    atStation = true;
    timeAtStation = 0;
}
于 2012-10-23T09:47:16.820 に答える
1
route = r; 
capacity = c; 

于 2012-10-23T09:47:47.213 に答える
0

出力には3つの問題があります。

まず、配列のコンテンツを印刷する場合は、その要素を反復処理する必要があります。それ以外の場合は、メモリアドレスを印刷するだけです。hava APIを支援するために、次のメソッドがあります。

Arrays.toString(Object[]);

同じ問題があなたにありますTrain、あなたはメソッドをオーバーライドしませんtoString()、それがこれがデフォルトの振る舞いであるため、Javaがそれをアドレスに出力する理由です。

このメソッドをルートクラスに追加して、何が起こるかを確認してください。

@Override
public String toString(){
   return "This is message from rout"    
}

電車のコンストラクターの最後のアリ

パラメータを変数に割り当てます。逆もまた同様です。

public Train(Route r, int c, int i, boolean f, int s){
    this.route = r;
    this.capacity = c;
    this.recentLoc = i;
    this.forwards = f;
    this.speed = s;
    this.atStation = true;
    this.timeAtStation = 0;
}
于 2012-10-23T09:48:58.287 に答える
0

これらの割り当ては逆である必要があります。左側にあるものが割り当てられるものです。

r = route;
c = capacity;
i = recentLoc;
f = forwards;
s = speed;

する必要があります

 route = r;
   capacity = c;
   recentLoc = i;
    forwards = f;
    speed = s;
于 2012-10-23T09:49:13.097 に答える
0

あなたは間違った割り当てをしています。

r = route;

の値routeがに割り当てられることを意味しますr

コンストラクターを次のように変更します。

public Train(Route r, int c, int i, boolean f, int s)
{     
     route = r;;     
     capacity = c;;     
     recentLoc = i;     
     forwards = f;     
     speed = s;     
     atStation = true;     
     timeAtStation = 0; 
} 
于 2012-10-23T09:50:25.153 に答える