0

不正な URL を取得した場合に例外をスローするオブジェクト "LinkFinder" がありますが、System.out を使用してエラーを出力するという考えは好きではありません。コンストラクターが初期化されたオブジェクトを返す代わりに、null または何かを返すように強制できますか?

private URL url;

//constructor in question
public LinkFinder(String sourcePage) 
{
    try
    {
        this.url = new URL(sourcePage);
    }
    catch (MalformedURLException e)
    {
        System.out.print("Malformed URL Exception: Setting URL to NULL");
        this.url = null;
    }

}
4

6 に答える 6

1

いいえ、できません。コンストラクターがオブジェクトを返さない (または null を返さない) 唯一の方法は、それが完了していない場合です。

URLの形式が正しくない場合に null オブジェクトが必要な場合は、オブジェクトのインスタンス化コード (つまりnew LinkFinder(url)) の周りに try ブロックを適用し、その catch ブロックで null への参照を設定します。

于 2012-11-17T07:44:28.853 に答える
0

あなたの質問から、LinkFolder クラスの意図は、アプリケーションである種のデータを処理することであり、プログラムのプレゼンテーションを処理する別のクラスによって使用されると想定しています。

エレガントな方法は、コンストラクターが例外を再スローするようにすることです。これにより、プレゼンテーション レイヤーは try catch を使用してエラーを処理します。

public LinkFinder(String sourcePage) throws MalformedURLException
{
    this.url = new URL(sourcePage);
}

プレゼンテーションは次のようになります。

try {
    LinkFinder lf = new LinkFinder("whatever");
} catch (MalformedURLException e) {
    System.out.print("Malformed URL Exception.. it has sense to put it right here");
}

エラーを表示する方法にprintlnを変更します。

于 2012-11-17T07:20:18.770 に答える
0

質問の 2 番目の部分に直接答えるには、いいえ、コンストラクターを return にすることはできませんnull。@Hernanが示唆するように、コンストラクターは新しく構築されたオブジェクトを返すか、エラーをスローすることしかできません。それを処理するもう 1 つの方法として、設定this.url = nullでは、外部コードでこの状態をチェックする必要があります。または、urlプライベートにしてから、このクラスの内部コードのみで状態をチェックする必要があります。bool isUrlBroken()必要に応じて、外部コードが条件をチェックできるようにするメソッドを提供できます。

于 2012-11-17T07:32:13.843 に答える
0

理論的には、これがブロック iecatch を介した例外処理の唯一の目的でありtry-catch、予想される例外を必要に応じて処理します (この場合は、割り当てますthis.url) null

invalid の場合にLinkFinder適切に初期化する必要があると思われる場合、コードは問題ないようです。必要に応じて対を決めることができますが。nullsourcePageSystem.outlogger

しかし、実際this.urlには、無効な入力を消化して割り当てているため、後でnull発生する可能性があるため、あまり意味がありません。NullPointerExceptionデフォルト値で初期化することをお勧めします。

于 2012-11-17T07:12:44.243 に答える
0

コンソールに例外を出力する代わりに、ロガーを使用して例外をログに記録し、null を URL として返すことができます。ただし、この後、null の URL を確認する必要があります。

非常に使いやすいApacheからlog4jを使用できます。

于 2012-11-17T07:15:59.950 に答える
0

を明示的に呼び出す必要はありませんthis.url = null;。例外がスローされた場合、urlは初期化されず、インスタンス変数であるため、デフォルト値が に設定されるためnullです。この「予期しない動作」を解決するには、try catch を使用して状況を処理する必要があります。たとえば、別のurl.

于 2012-11-17T07:18:15.047 に答える