1

皆さんにはばかげた質問のように思えるかもしれませんが、私は Java 初心者であり、まだ概念全体を把握しようとしています。したがって、私は基本的に、グループをデータベースに追加できる単純な劇場管理システムを持っています。各グループには、それぞれ固有の学生 ID と名前を持つ学生を追加できます。グループにリハーサル日を追加することもできます。これらは両方とも、別々のリンクされたリストに保存されます。これは私のリハーサル オブジェクトです。

public Rehearsal(int d, int m, int y) {
    day = d;
    month = m;
    year = y;
}

これは、グループ クラスの addRehearsal メソッドです。

public void addRehearsal(int d, int m, int y) {
    Rehearsal newrehearsal = new Rehearsal(d, m, y);
    if (!RehearsalDates.contains(newrehearsal)) {
        RehearsalDates.add(newrehearsal);
    }
    else
        JOptionPane.showMessageDialog(null, "Rehearsal already exists for this group!", "Error", JOptionPane.WARNING_MESSAGE);
}

私の質問は、入力できる値をどこでどのように制限できるかです。つまり、int d > 31 または int m > 12 に値が入力された場合、プログラムはメッセージ ダイアログの形式でエラーを表示します。ユーザーはリハーサル日を作成できるため、これは実際には必要ありません。過去も未来も。

助けてくれてありがとう:)

4

2 に答える 2

2

日付の検証は、各パラメーターのチェックよりも複雑です。たとえば、すべてのパラメーターが「範囲内」であっても、で呼び出すと(29, 2, 2000)無効になります (2000 年はうるう年ではなかったことを思い出してください)。

チェックする唯一の適切な方法は、パラメーターから日付を解析して例外をキャッチすることです。これを行うにはいくつかの方法がありますが、最も簡単な方法は次のとおりです。

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
    }
    // rest of code
}

への呼び出しsetLenient()が必要であることに注意してください。そうしないと、無効な入力が次の有効な日付に「ロールオーバー」します。たとえば、36-12-2012として解析され05-01-2013ます。

このコードを配置するのに最適な場所は、例外をスローするコンストラクターです。

public Rehearsal(int d, int m, int y) {
    try {
        sdf = new SimpleDateFormat("d-M-yyyy");
        sdf.setLenient(false);
        sdf.parse(d + "-" + m + "-" + y);
    } catch (ParseException e) {
        // the parameters are not valid
        throw new IllegalArgumentException();
    }
    day = d;
    month = m;
    year = y;
}

そして、あなたはそれが呼び出されたところならどこでもこれをキャッチするでしょう.

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}
// rest of method

さらに優れた設計は、Date オブジェクトを渡し、入力を検証する責任を呼び出し元に負わせることであり、throw と catch のコードが少なくなります。

于 2013-04-07T20:24:08.253 に答える
0

IllegalArgumentExceptionのコンストラクターから をスローしてから、メソッドRehearsalでキャッチしてみませんか。addRehearsal

public Rehearsal(int d, int m, int y) {
    if (d < 1 || d > 31) {
        throw new IllegalArgumentException("Invalid day");
    }
    if (m < 1 || m > 12) {
        throw new IllegalArgumentException("Invalid month");
    }
    day = d;
    month = m;
    year = y;
}

メソッドでは、addRehearsal構築時に例外をキャッチします。

Rehearsal newrehearsal;
try {
    newrehearsal = new Rehearsal(1, 2, 3);            
} catch (IllegalArgumentException ex) {
    JOptionPane.showMessageDialog(null, "Invalid date input!", "Error", JOptionPane.WARNING_MESSAGE);
    return;
}

これは中間的な解決策である必要があります-これにより、無効な日付の作成が確実に防止されます。

最初に無効なデータを防ぐために、後で入力にリスナーを追加することをお勧めします。

最後に、Calendarカスタムの日付オブジェクトではなく を使用することを検討してください。

于 2013-04-07T20:09:58.660 に答える