0

アプリケーションのモデル レイヤーをテストしていて、要素をリストに追加したいと考えています。しかし、データ モデルにデータを追加しようとすると、アプリケーションがクラッシュします。この理由が見つかりません。

データモデルの私のコード。

public class DataModel {


private List<Log> logs;
private static DataModel instance;
private Context ctx;


//Singleton constructor
private DataModel()
{
   //This makes it crash
   logs.add(new Log("1234","sms", 123545, 1, 0));

   //Load logs from database - Not done yet.

}

public static DataModel getInstance()
{
    if (instance == null)
    {
        //Creates the instance
        instance = new DataModel();
    }
    return instance;
}

ログの私のコード

public class Log {


private String phonenumber;
private String type;
private long date;
private int incoming;
private int outgoing;
private long id;

//Constructor for incoming sms or call
public Log( String Phonenumber, String Type, long Date, int Incoming, int Outgoing)
{

    this.phonenumber = Phonenumber;
    this.type = Type;
    this.date = Date;
    this.incoming = Incoming;
    this.outgoing = Outgoing;
}


public long getId()
{
    return id;
}

public void setId(long id)
{
    this.id = id;
}

public String getPhonenumber()
{
    return phonenumber;
}

public void setPhonenumer(String phonenumber)
{
    this.phonenumber = phonenumber;
}

public String getType()
{
    return type;
}

public void setType(String type)
{
    this.type = type;
}

public long getDate()
{
    return date;
}

public void setDate(long date)
{
    this.date = date;
}

public int getIncoming()
{
    return incoming;
}

public void setIncoming(int incoming)
{

    this.incoming = incoming;

}

public int getOutgoing()
{
    return outgoing;
}

public void setOutgoing (int outgoing)
{

    this.outgoing = outgoing;
}
4

5 に答える 5

2

を初期化していませんlogs。このステートメントnullを実行すると、次のようになります。

logs.add(new Log("1234","sms", 123545, 1, 0));

変化する:

private List<Log> logs;

に:

private List<Log> logs = new ArrayList<Log>();
于 2013-09-28T03:18:47.367 に答える
0

使用前にリストを初期化する

コンストラクターでリストを初期化することもできます

パブリッククラスのデータモデル{

private List<Log> logs= new ArrayList<Log>();
private static DataModel instance;
private Context ctx;


//Singleton constructor
private DataModel()
{
   //This makes it crash
   logs.add(new Log("1234","sms", 123545, 1, 0));


   int i=0;

   //Load logs from database - Not done yet.

}

public static DataModel getInstance()
{
    if (instance == null)
    {
        //Creates the instance
        instance = new DataModel();
    }
    return instance;

}

}

于 2013-09-28T04:16:06.140 に答える
0

グローバル ログを初期化せず、同期された getInstance メソッドも使用して、2 つのスレッドが同時にアクセスしようとした場合に 1 つのインスタンスのみが作成されるようにします。

次のコードを使用します。

public class DataModel {
    private List<Log> logs;
    private static DataModel instance;
    private Context ctx;


    //Singleton constructor
    private DataModel()
    {
       if(logs == null){
           logs = new ArrayList<Log>();
        }
       logs.add(new Log("1234","sms", 123545, 1, 0));

       //Load logs from database - Not done yet.

    }

    public synchronized static DataModel getInstance()
    {
        if (instance == null)
        {
            //Creates the instance
            instance = new DataModel();
        }
        return instance;
    }
于 2013-09-28T04:31:22.563 に答える