2

残念ながら、私はを制御できませんgetUserByUserId(String)。動作の仕方は、ユーザーが見つかった場合はユーザーを返し、ユーザーOntNoObjectExistsExceptionが見つからなかった場合はをスローすることです。私の問題は、何らかの理由で、キャッチOntNoObjectExistsExceptionがスローされたときにキャッチされないことです。

この例外のタイプ階層は次のとおりです:OntNoObjectExistsException-> OntException-> Exception-> Throwable

public boolean isUserIdAvailable(String userId) {
    try {
        return super.getUserByUserId(userId) == null;
    } catch (OntNoObjectExistsException e){
        return true;
    } catch (Exception ex) {
        appLog.error(ex.getMessage());
    }
    return false;
}

このコードを試して水域をテストしましたが、問題は解決しませんでした。注意してください、私は捕まえてThrowableいます。

public boolean isUserIdAvailable(String userId) {
    try {
        return super.getUserByUserId(userId) == null;
    } catch (Throwable ex) {
        appLog.error(ex.getMessage());
    }
    return false;
}

スタックトレースは次のとおりです。

com.opennetwork.exception.OntNoObjectExistsException: User not found
    at com.bcbst.dsmart.api.WebUser.getUserByUserId(WebUser.java:411)
    at com.bcbst.dsmart.api.WebProspectiveMemberBean.isUserIdAvailable(WebProspectiveMemberBean.java:71)
    at com.bcbst.dsmart.api.EJSLocalStatelessWebProspectiveMember_ce00ef7b.isUserIdAvailable(EJSLocalStatelessWebProspectiveMember_ce00ef7b.java:120)
    at com.bcbst.prospectivememberweb.actions.UsageagreementAction.execute(UsageagreementAction.java:61)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

また、これはjava1.4であることに注意してください。私が今コントロールできない何か他のもの。

4

4 に答える 4

2

仮説を提案させてください。WebUser.getUserByUserIdこのコードが含まれています:

if (userNotFoundCondition) {
  OntNoObjectExistsException e = new OntNoObjectExistsException("User not found");
  logger.error("User not found", e);
  throw e;
}

この仮説は、提出したすべての証拠と100%一致しています。調査を進めるには、まずこの仮説を反証する必要があります。

于 2012-11-06T17:03:15.917 に答える
1

newをスローするスーパークラスで例外をキャッチしていますThrowable

于 2012-11-06T16:12:03.070 に答える
1

フロー制御に例外を使用することは非常に悪い習慣であるという他の回答に同意しますが、実際にあなたの質問に答えるために、例外の代わりにThrowableをキャッチしようとしましたか?

catch (Throwable t) {
    // handle here.
}
于 2012-11-06T16:14:45.667 に答える
0

あなたは制御できませんgetUserByUserId(); ただし、同じパッケージcom.bcbst.dsmart.apiに含まれているように見えるため、この回答は、同じプロジェクト内での責任の範囲外であると想定していますが、ソースファイルはあります

getUserByUserId()属するクラスのソースと、実行時に使用されているコンパイル済みバージョンの間に不一致がある可能性がありますか?

ステートメントがコンパイルされた後にそのクラス内で変更された場合throws、または例外自体が変更された場合、これはあなたのこの明らかにばかげた状況を説明する可能性があります。

その仮説の詳細については、SOに関するこの回答を参照してください。

=>すべてを再コンパイルし、再デプロイします。

于 2012-11-06T17:10:10.790 に答える