0

IllegalDimensionExceptionクラスを拡張する新しい例外クラスを作成しますException。1 つはデフォルト値、もう 1 つはメッセージ「指定した図形の次元が不正です。

これはこれを行う正しい方法のようですか??

public class IllegalDimensionException extends Exception {
    String message; //the message that will be used
    String Eplicitm = "Illegal dimension for the figure you specified";

    //constructor one
    public IllegalDimensionException (String m){
        m = message;
    }
     //constructor two
    public IllegalDimensionException(String E){
        E = Eplicitm;

    }
    public static void main(String[] args){
        return E;
    }

}

1 つが無効になることなく 2 つのコンストラクターを作成するのに問題がありますか? これを正しく機能させる方法について何か提案はありますか??

4

5 に答える 5

0

2つのコンストラクターがあります。1つはデフォルト値で、もう1つは「指定した図のディメンションが無効です」というメッセージを使用する明示的な値です。

2つのコンストラクターに本当に必要なのは、デフォルト(パラメーターなし)のものと、Stringパラメーターを受け入れるもののようです。例えば、

public IllegalDimensionException() {
    super(Eplicitm);
}

public IllegalDimensionException(String m) {
    message = m;
}

デフォルトのコンストラクターでのsuper()呼び出しは、のコンストラクターを呼び出します。コンストラクターはException、を受け入れ、それStringを渡しますEplicitm

ただし、コードスニペットのロジックにいくつかの根本的な欠陥があり、その上で指摘したいと思います。

  1. コンストラクターに追加の戻り型を指定することはできません(「コンストラクター2」でのようにpublic void IllegalDimensionException)。これは、オブジェクトの新しいインスタンスを作成するため、IllegalDimensionException基本的には戻り型であるためです。上記のシグニチャは、代わりに、この例外のインスタンスによって呼び出される必要があるという新しいメソッドを作成しIllegalDimensionExceptionますvoid...したがって、基本的に、過度に複雑な(そしてフォーマットが不十分な)名前を持つsetterメソッドを作成しました。

  2. Exceptionメソッドを持つことは意味がありませんmain(String[])。Amain()は基本的にプログラム全体のキックスタートであり、anはプログラムExceptionで問題が発生したときに作成されるものです。より複雑なプロジェクトを作成するときは、各クラスの機能を基本的に分離し、区別し、論理的に保つ必要があります。

  3. デフォルト値などの定数は、として宣言する必要がありますprivate static final。コードがそのままの状態で、インスタンスを取得できるコードは、をIllegalDimensionException呼び出すだけでデフォルトのメッセージを変更できますtheException.Eplicitm = "Yo yo yo, wassup."。あまり役に立たないエラーメッセージ。これは、変数のデフォルトのプライバシーがであるためですpublic。幸い、staticまだ宣言していないので、このような変更は例外の1つのインスタンスにのみ影響します...ただし、作成される可能性のあるすべての例外にわたって、これの不変バージョンが1つだけである方がはるかに良い方法です。

  4. 変数名はキャメルケース(variableName)で、クラス名はすべて大文字(MyClass)で始める必要があります。定数はすべて大文字で、アンダースコア(MY_CONSTANT_VALUE)として区切りを付ける必要があります。

上記のいくつかは気難しいように聞こえるかもしれませんが、実際にはそうではありません。上記のすべては、コードの抜け穴を閉じるか(一部はかなり危険です)、コードを大幅に読みやすくします(これは大きな恩恵です-なぜあなたが一体何のセクションを書いたかを忘れてしまうからです3か月後に戻って確認するときにコードを記述します)。Eplicitmたとえば、複雑なカスタム定義のオブジェクトの名前のように見えるので、(スペルは別として)あなたが何を意味するのかを理解するのに時間がかかったのは私だけではないと確信しています...ではありませんString

于 2012-10-08T17:42:02.063 に答える
0

2つのコンストラクター(またはそのことに関する任意のメソッド)は、異なるメソッドフィンガープリント(別名署名)を持っている必要があります。指紋は次のもので構成されます。

  • メソッド名
  • メソッドの戻り型
  • メソッドパラメータ(タイプ別)

同じフィンガープリントを持つ2つのコンストラクターを作成しようとしていますが、これは許可されていません。結局のところ、コンパイラはどのメソッドを呼び出そうとしているのかをどのようにして知るのでしょうか。

補足として; あなたのコードはほとんど意味がありません:

public IllegalDimensionException (String m){
    m = message;
}

文字通り効果はありません。ローカル変数の値をmインスタンス変数で上書きしていますmessage...これを逆に行うつもりだったと思いますか?

于 2012-10-08T17:27:13.857 に答える
0

多分そのようなものがあなたの質問に答えます:

public IllegalDimensionException (String m) {
    super(m); // you may use the exception message member instead of defining yours
    message = m; 
}

public IllegalDimensionException(){
    this(Eplicitm);
}

したがって、実際には 2 つのコンストラクターがあります。1 つはデフォルト値で、もう 1 つはカスタム メッセージです。これが期待どおりの場合、Eplicitm は定数 (静的最終) である必要があります。

于 2012-10-08T17:30:19.700 に答える
0

これはあなたが探しているものかもしれません。あなたが答えている質問は不明確なので、わかりません:

public final class IllegalDimensionException extends Exception {
  private static final String DEFAULT = 
      "Illegal dimension for the figure you specified";

  //constructor one
  public IllegalDimensionException(){
    super(DEFAULT);
  }

  //constructor two
  public IllegalDimensionException(String message){
    super(message);
  }
}

super()例外メッセージをスーパークラスに正しく渡すための の使用法に注意してください。

于 2012-10-08T17:30:24.243 に答える
0

コンストラクターは戻り値の型を持つべきではないため、2 番目の「コンストラクター」は実際にはコンストラクターではなく、コンストラクターのような名前のメソッドです。ここから何も返さないのに、なぜエラーが発生しないのか疑問に思っています。そして、2番目のものから void を削除するだけでは、両方のコンストラクターが同じタイプの引数を持ち、コンストラクターがオーバーロードされず、代わりに重複するため、機能しません。その場合、再びエラーが発生します。あなたの質問の本当の答えについては、このリンクを見てください。Javaでカスタム例外クラスを定義する方法、最も簡単な方法は?

于 2012-10-08T17:23:58.587 に答える