状況に応じて - メインメソッドでは、オブジェクトをチェックする子メソッドが呼び出され、この子メソッドで例外がスローされます(オブジェクトの1つリストのNULLに)。しかし、メインメソッドのコードはまだ実行され続けています! コード例:この点で例外がスローされ、さらにコードが実行される
@Transactional
public boolean addCompany(List<Company> companies, List<Address> addresses) throws Exception{
checkAddress(addresses);
try{
for(int i = 0; i < companies.size(); i++){
if(findCompany(companies.get(i).getId()) == null && !isExistsCompany(companies.get(i))){
companies.get(i).setAddress(addresses.get(i));
this.em.persist(companies.get(i));
}
}
}catch(Exception e){
return false;
}
return true;
}
public void checkAddress(List<Address> addresses) throws Exception{
try{
if(addresses == null)
throw new Exception(Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName() + ": Invalid parameter: list is null");
for(Address a : addresses)
if(a == null)
throw new Exception(Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName() + ": Invalid list item: object is null");
}catch(Exception e){
e.printStackTrace();
}
}
、いくつかの質問が生じた: を - コードが停止しない理由は? - オプションとして、checkAddressメソッドの型をvoidからbooleanに変更し、true/falseを処理するmainメソッドで状況を脱出する必要がありますか? - フロントエンドでこのようなエラーを正しく処理する方法 - テキストをフロントエンドに送信するか、コード500を処理するだけですか?その場合は、バックエンドで例外を生成する理由を開発プロセスで助けてください。それをうまく処理するには? アドバイスをお願いします。 ありがとうございます。
私はあなたがこのコード例である知っているが、私は、全体 'getStackTraceメソッド()[n]は'事は悪い考えであることを指摘する必要性を感じます可読性上の理由とパフォーマンス上の理由だけでなく、JVMがスタックフレームを削除できるためです。クラス名とメソッド名を[特定のLoggerメソッドが行う](https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger)のようにString引数として渡す方がずっと良い方法です。 html#entering-java.lang.String-java.lang.String-)。 – VGR
getStackTrace()がなければ、現在のクラスとメソッドの名前をLoggerに渡す方法は他にありますか? – Denis
checkAddressはその情報を取得しようとすべきではありません。呼び出し元は代わりにそれらをパラメータとして渡す必要があります。私がリンクしているLoggerメソッドのように。 – VGR