1

基本的に、アプリの一部としていくつかの日付を操作するために、簡単なクラスを作成しました。私はJavaに精通しているわけではないので、日付を処理するコード、主にカレンダークラスをオンラインで見つけました。そこで、サンプルコードからいくつかの部分を取り出して、次のクラスを考え出しました。

package com.example.myApp;
import java.util.Calendar;
import android.util.Log;

public class Date {
    public int day;
    public int month;
    public int year;
    public String formattedDate;
    public Calendar calendar;

    public Date(){
        //Set to today by default.
          // Create a Calendar object
          Calendar calendar = Calendar.getInstance();        
          // Get current day from calendar
          day = calendar.get(Calendar.DATE);
          // Get current month from calendar
          month = calendar.get(Calendar.MONTH); 
          // Get current year from calendar
          year = calendar.get(Calendar.YEAR);
    }

    public String getDate(){
        formattedDate = day+"/"+month+"/"+year;
        return formattedDate;
    }

    public void incDate(){
        calendar.add(Calendar.DATE, +1);
    }
}

メインアクティビティでincDate()メソッドを実行すると、プログラムがクラッシュします。このクラスはかなり基本的なものであり、私が持っている他のクラスと比べて完全にうまく機能する唯一の違いは、通常のインスタンス化ではなく、カレンダーのインスタンスを宣言することです。これが問題だと思います。

問題のメソッドがアプリのクラッシュを引き起こしている理由を誰かが説明できれば、私は非常に感謝しています。

PS。私はこのクラスに基づいてさらにメソッドを追加するつもりですが、上記の理由から、現時点では明らかに無意味なベンチャーです。

4

2 に答える 2

3

変化する

Calendar calendar = Calendar.getInstance();        

calendar = Calendar.getInstance();        

あなたはコンストラクターで可変シャドウイングをしている、それだけです。

シャドウを変数化するときは、別のスコープの変数と同じ名前を使用します。この場合、calendarコンストラクターに対してローカルをインスタンス化するだけなので、スコープが設定されたクラスインスタンスは残りcalendarますnull。また、クラスにはすでにJavaが提供するクラスであるため、クラスに名前を付けないことをお勧めしDateます。あいまいさを導入していることになります。

于 2013-02-15T23:45:04.450 に答える
1

この行を変更します。

Calendar calendar = Calendar.getInstance();   

に:

calendar = Calendar.getInstance();   

インスタンス変数という新しい変数を初期化するため、インスタンス変数をshadows呼び出すとincDate()calendarnull

于 2013-02-15T23:45:12.967 に答える