1

ユーザー入力を検証し、オブジェクトを作成して配列リストに追加する必要がある宿題用のプログラムを書いています。関連するコードと思われるものだけを含めましたが、確かに初心者なので、他に確認する必要がある場合はお知らせください。

ユーザーに文字列を入力してもらい、それが double かどうかを確認します。double でない場合は、作成した例外をスローします

     try{
        price = Double.parseDouble(strPrice);
     }
     catch(NumberFormatException nfe){
        CDException cde = new CDException();
        cde.setMessage("Price must be a number,\nCannot create CD");
        throw cde;
     }

それが数値であることを確認した後、他のクラスで、それが必要な範囲内にあることを確認します。(この場合は負ではない)次に、値を持つオブジェクトを作成します

public void setPrice(double newPrice)throws Exception{
    if(newPrice >= 0){
        this.price = newPrice;
    }
    else{
        CDException cde = new CDException();
        cde.setMessage("CD Price cannot be negative,\nCannot create CD");
        throw cde;
    }
}

だから私の質問は...

これを 1 つのステップで行う方法はありますか。ユーザーが数値を入力したことと、数値が負でないことの両方を確認してください。もう1つは、入力が空白の場合、それは入力ループを終了する命令です。

4

3 に答える 3

2

コードを次のように変更できます。

try {
    price = Double.parseDouble(strPrice);
    if (price < 0) {
        throw new CDException("Can't be negative");
    }
} catch (NumberFormatException ex) {
     ...
}

しかし、問題はあなたが本当にそれをやりたいかどうかです。setPrice設計の観点からは、解析ロジックの一部として行うよりも、内部で「否定的な」チェックを行う方が理にかなっています。

于 2012-11-30T04:30:18.977 に答える
2

私の意見では、それを別々の機能に分割する方が良いです。コードの再利用を促進する、関心の分離が改善されます。ただし、関数を組み合わせることに固執する場合(そうすべきではないと思います)、これは非常に単純な「マッシュアップ」です。

public void setPrice(String newPriceStr) throws CDException {
    if(newPriceStr == null) throw new CDException("Null value given for price");

    double newPrice = -1;

    try {
        newPrice = Double.valueOf(newPriceStr);
    } catch(final NumberFormatException nfe) {
        throw new CDException("Price must be a number,\nCannot create CD");
    }
    if(newPrice >= 0){
        this.price = newPrice;
    }
    else{
        throw new CDException("CD Price cannot be negative,\nCannot create CD");
    }
}

例外の作成とスローの短縮形に注意してください。

于 2012-11-30T04:31:40.077 に答える
2

これは宿題のためであり、この回答はクラスのインストラクターによって受け入れられない可能性があることはわかっていますが、「現実の世界」では、ホイールを再発明するのではなく、検証フレームワークを使用します。たとえば、Java EE 6 に組み込まれています: http: //en.wikipedia.org/wiki/Bean_Validation

それらを使用したチュートリアルは次のとおりです。http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html

いくつかの例:

public class CD {
    @NotNull
    @Size(min=1, max=16)
    private String CDName;

    @Digits(integer=6, fraction=2)
    BigDecimal price;

}

利点

  • DRY (同じことを繰り返さないでください。たとえば、検証を 1 回宣言します)
  • 読みやすい(明確で文書化されている)

欠点

  • Java EE は物事を複雑にしすぎる傾向がありますが、それでも有効な選択です。
  • 誰もが注釈を使用する「マジック」を好み、自分の目でコードを見るのが好きなわけではありません

長所/短所は他にもあると思いますが、それはこの回答/質問の範囲外です。

于 2012-11-30T04:38:15.557 に答える