nullを返します。例外がキャッチされる可能性があるため必要ですが、そのような場合は、nullかどうかをすでに確認しているため(呼び出しているクラスがクローン作成をサポートしていることがわかっていると仮定できます)、tryステートメントが失敗することはありません。
tryステートメントが決して失敗しないことがわかっている方法で関係する入力についての詳細を知っている場合、それを持つことのポイントは何ですか?try物事が常に成功することが確実であることがわかっている場合は避けてください(ただし、コードベースの存続期間全体にわたって絶対に確信できることはまれです)。
いずれにせよ、残念ながらコンパイラはマインドリーダーではありません。それは関数とその入力を見て、それが持っている情報を与えられて、returnあなたがそれを持っているのでそれは一番下にそのステートメントを必要とします。
構文を満たし、コンパイルエラーを回避するために(到達しないことを説明するコメント付きで)最後に追加のreturnステートメントを挿入するのは悪い習慣ですか、それともこのようなコードを追加して追加するより良い方法がありますか? returnステートメントは不要ですか?
まったく逆に、コンパイラの警告を回避することをお勧めします。たとえば、別のコード行が必要な場合などです。ここでは行数についてあまり心配しないでください。テストを通じて機能の信頼性を確立してから、次に進みます。returnステートメントを省略できるふりをして、1年後にそのコードに戻ることを想像してからreturn、下部にあるそのステートメントが、可能な仮定のために省略された理由の詳細を詳述するコメントよりも混乱を引き起こすかどうかを判断してみてください。入力パラメータについて作成します。ほとんどの場合、returnステートメントは扱いやすくなります。
そうは言っても、特にこの部分について:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
ここでの例外処理の考え方には少し奇妙なことがあると思います。あなたは一般的に、あなたがそれに応じてできる意味のある何かを持っているサイトで例外を飲み込みたいです。
try/catchトランザクションメカニズムと考えることができます。tryこれらの変更を行うと、失敗してcatchブロックに分岐した場合catch、ロールバックおよびリカバリプロセスの一部として、これに応じて(ブロック内にあるものは何でも)実行します。
この場合、単にスタックトレースを出力してから、nullを返すように強制されることは、トランザクション/リカバリの考え方とは異なります。コードは、エラー処理の責任をすべてのコード呼び出しgetCloneに移し、手動で障害をチェックします。をキャッチCloneNotSupportedExceptionして別のより意味のある形式の例外に変換してスローすることをお勧めしますが、これはトランザクション回復サイトとは異なるため、この場合は単に例外を飲み込んでnullを返すことは望ましくありません。
例外をスローすることでこれを回避できる場合は、手動で失敗をチェックして対処する責任を呼び出し元に漏らすことになります。
これは、ファイルをロードする場合のようなもので、高レベルのトランザクションです。あなたはtry/catchそこにいるかもしれません。tryingファイルをロードするプロセス中に、オブジェクトのクローンを作成する場合があります。この高レベルの操作(ファイルのロード)のどこかで障害が発生した場合は、通常、この最上位のトランザクションtry/catchブロックまで例外をスローして、ファイルのロードの失敗から正常に回復できるようにします(ファイルのロードに関係なく)。クローン作成などのエラーが原因です)。したがって、通常、このような細かい場所で例外を飲み込んでからnullを返すことは望ましくありません。たとえば、例外の価値と目的の多くが無効になるためです。代わりに、例外を意味のある方法で処理できるサイトにまで伝播させたいと考えています。
Objectパラメーターを取ります。メソッドaをサポートするクラスではない場合clone(またはこれはObject?で定義されている場合)、またはcloneメソッド中にエラーが発生した場合(または、現時点では考えられないその他の間違い)、例外がスローされ、次のようになります。 returnステートメント。