3

Java で独自の UI コンポーネントを作成しました。モデルがあり、モデルのメソッドのいくつかは、ModelException と呼ばれる例外をスローできます。このコンポーネントを JRuby で使用したいのですが、ModelException を発生させることができません:

raise ModelException # it cause TypeError: exception class/object expected

そこで、Java で ModelException をスローするメソッドを作成し、それを JRuby で呼び出してみました。

public class ScriptUtils {

private ScriptUtils() {
}

public static void throwModelException(ModelException e)
        throws ModelException {
    throw e;
}
}

しかし、JRuby から throwModelException を呼び出すと、次のようになります。

org.jruby.exceptions.RaiseException: Native Exception: 'class  app.ui.ModelException';   Message:
; StackTrace: app.ui.ModelException
...
Caused by: app.ui.ModelException

このネイティブ例外は、Java コードでは処理できません。

JRubyでJava例外をスローしてJavaでキャッチする方法はありますか?

4

1 に答える 1

0

私が最初にあなたの質問を読み間違えたので、これは私の元の答えの完全な書き直しです!

Java例外を発生させてJRubyでキャッチすることはできますが、raiseの呼び出し方法には少し注意する必要があります。

raise ModelException

JRubyModelExceptionには単純な定数のように見えるため、(ご覧のとおり)タイプエラーが発生します。Rubyではクラス名は定数であることに注意してください。Exception次のように、Rubyの直接サブクラスを作成できます。

raise RuntimeError

しかし、そのようなサブクラスは特殊なケースだと思います。コンストラクターで呼び出す必要のある実際のJavaクラスは次のとおりです。

raise ModelException.new

または、そのクラス用に持っているコンストラクター。JRubyののインスタンスはModelException、JRubyがそのように作成するため、のサブクラスですExceptionが、Javaクラス自体はそうではありません。ModelExceptionこれはすべて、クラスを正しくインポートしたことを前提としています。

2番目の例については、そのエラーをまったく再現できませんでした。上記のように、例外オブジェクトを正しく作成している限り、それは機能し、「ネイティブ例外」に関する苦情はまったく見られませんでした。だから、そこで何が起こっているのかわかりません、ごめんなさい。

于 2012-01-29T13:16:37.950 に答える