0

これは、Lineベクトルとして指定された 2 つの点をパラメーターとして取り、それらの間を通過する無限線をモデル化します。2 番目のクラス はBoundedLine、2 つの点を取り、それらを結ぶ有限線をモデル化します。

2 つのポイントが同じである場合、によって例外がスローされLineます。つまり、スーパー コンストラクターへの呼び出しをBoundedLinetry catch ブロックでラップする必要があります。残念ながら、パラメーターは try ブロック内では使用できないようです。どうすればそれらにアクセスできますか?

// Constructor in Line
public Line (Vector start, Vector end) throws Exception  {

    if (start.equals (end)) {
        throw new Exception ( "Points are the same" );
    }

    else {

        this.start = start;
        this.end = end;

        modelLine (start, end);            
    }        
}

// Constructor in BoundedLine
public BoundedLine (Vector start, Vector end) throws Exception {

    try {
        super (start, end);
    }
    catch (Exception e) {
        throw e;
    }

    applyBoundaries (start, end);        
}

「クラス Line のコンストラクター Line は指定された型に適用できません。必須: Vector,Vector; 検出: 引数なし; 理由: 実引数リストと仮引数リストの長さが異なります」というコンパイル時エラーが発生します。

例外と try/catch ブロックを削除すると、コードは正常に機能します。

4

6 に答える 6

2

BoundedLineコンストラクターを宣言する場合は、 catch する必要throws Exceptionはありません。

いずれにせよ、スーパークラス コンストラクターの呼び出しは、サブクラス コンストラクターの最初の行でなければなりません。

これを試して:

public BoundedLine (Vector start, Vector end) throws Exception {
    super (start, end);
    applyBoundaries (start, end);        
}

またException、特定の例外をスローする必要があるため、スローは大したことではありません。IllegalArgumentExceptionJDKには、使用できる未チェックのものがすでにあります。チェック例外が必要な場合は、独自に作成することをお勧めします。

public Line (final Vector start, final Vector end) {
    if (start.equals (end)) {
        throw new IllegalArgumentException( "Points are the same" );
    }
    this.start = start;
    this.end = end;
    modelLine (start, end);                    
}

さらに、あなたが使用しVectorている

  1. rawtype - Genericsについてお読みください
  2. 廃止されたコレクション タイプListです。コレクションについてお読みください
于 2013-10-15T12:09:29.007 に答える
1

明示的なコンストラクターが定義されていないすべての Java オブジェクトには、サブクラスのコンストラクターの前に呼び出される引数なしの暗黙的なコンストラクターがあります。

問題は、スーパー コンストラクターの呼び出しがサブクラス コンストラクターの最初のステートメントではないため、JVM がスーパークラスのデフォルトの引数なしコンストラクターを呼び出そうとしていることです。別のコンストラクターを作成したため、このコンストラクターは存在しません。スーパークラスで。

他の人が言ったように、実行する最も簡単な方法は、try-catch を削除することです。例外を再スローするだけでは、何も購入できません。

于 2013-10-15T12:18:10.457 に答える
1

BoundedLine() を使用するときに try および catch ブロックを削除できます。例外が発生した場合は、最終的に throws ステートメントによって選択されます。関数を呼び出す場所で例外をキャッチすることを言及できます。

役に立つことを願っています。

于 2013-10-15T12:11:16.843 に答える
1

super の呼び出しが失敗した場合、オブジェクトは正しく作成されません。これにより、オブジェクト全体が理論的に未定義になる (iE がメモリ不足の場合) ため、これは Java では許可されていません。

于 2013-10-15T12:11:50.847 に答える
1

なぜ例外をキャッチして再度スローするのですか? try catch ブロックを削除するだけです。

于 2013-10-15T12:08:45.703 に答える
1

エマ、コンストラクター呼び出しはコンストラクターの最初のステートメントでなければならないという例外が述べられているため、基本コンストラクターは最初の行で呼び出され、基本コンストラクターの前に他のステートメントを配置することはできません。

なぜこの動作なのかを知るのは興味深いことであり、あなたの例は、そのようなステートメントが基本クラスのコンストラクターを進めることができない理由も説明しています。

あなたの例では、スーパーの前に try ステートメントを配置できた場合、例外をキャッチして何もせず、BoundedLine のオブジェクトが作成されますが、例外が基本クラスのコンストラクターからスローされたことがわかっているため、すべてのプロパティ、基本オブジェクトの値が作成されていないため、派生クラスのオブジェクトも初期化されていないはずです..
これが、基本クラスのコンストラクターを続行できる行またはコードがない理由を説明することを願っています.

于 2013-10-15T12:12:35.063 に答える