からコードを変更しています
Implementation 1 :
public User getUser(String userid) {
User user;
try {
// some code to get User
}catch(InterruptedException e) {
throw new CustomException();
}
return user;
}
に
Implementation 2 :
public User getUser(String userid) {
User user;
try {
// some code to get User
}catch(InterruptedException e) {
SomeHandlerInProject.throwCustomErr();
}
return user;
}
class SomeHandlerInProject {
public static void throwCustomErr() {
throw new CustomException();
}
}
実装2は、ユーザーが初期化されていない可能性があるというコンパイルエラーを表示します。誰かが私がここで欠落しているものを助けることができますが、私には非常に奇妙に見えます。
コンパイラーはSomeHandlerInProject.throwCustomErr()
常に例外をスローすることを認識していないため、コンパイラーのコード分析が行われる限り、メソッドは正常に戻る可能性があります。
もしそうなら、その価値は何でしょうuser
か?それは値を持たないので、コンパイラーはそれについて、必要に応じて文句を言います。メソッドでSomeHandlerInProject
クラスを再コンパイルせずに、例外をスローしないようにクラスを変更できるgetUser()
ため、コンパイラはそれについて不満を言うのが正しいことに注意してください。
にもかかわらず、あなたはメソッドは常に例外をスロー知っている、あなたはまだそれがないと、もしあなたが値を割り当てる必要がありますので、コードを記述する必要がありuser
、それを初期化することにより、または、それに割り当てることにより、いずれか、catch
ブロック。
例外を構築するために必要なロジックを共有することが目的である場合は、ヘルパーメソッドをreturn
例外ではなく、例外にして、呼び出し元にを実行させる必要がありthrow
ます。そうすればコンパイラは文句を言わないでしょう:
public User getUser(String userid) {
User user;
try {
// some code to get User
} catch (InterruptedException e) {
throw SomeHandlerInProject.buildCustomErr();
}
return user;
}
class SomeHandlerInProject {
public static CustomException buildCustomErr() {
return new CustomException();
}
}
スタックトレースは、コールスタックのスナップショットが作成されるコンストラクターの場所であるため、同じままです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加