0

SmartGWT の TreeGrid 用にカスタマイズされた DataSource を作成しようとしているときに、私は非常に奇妙な状況に陥っていることに気付きました。リクエストの EndRow プロパティを取得しているときに、それが存在しない場合、getEndRow 関数は null を返さない (または事前定義されたデフォルト値 -1 で十分) ことを発見しましたが、それがしようとするため、例外がスローされます。プロパティの値を int に変換します (javascript: undefined .java_lang_Integer_value)。私ができる最善の方法は、すべてを try キャッチに入れて、finally ブロックにデフォルト値を設定することでした。

int end = 0;
try{
    end = request.getEndRow();
}    
catch(Exception ex) {
    // DO NOTHING or something useless
    end = 0;
}
finally{
    if (end == 0 || end > total) {
       end = total;
    }           
}

出力された JavaScript コードは次のようになります。

try {
    end = com_smartgwt_client_util_JSOHelper_getAttributeAsInt__Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_String_2Ljava_lang_Integer_2(request.com_smartgwt_client_core_JsObject_jsObj, 'endRow').java_lang_Integer_value;
}
catch ($e0) {
    $e0 = com_google_gwt_lang_Exceptions_caught__Ljava_lang_Object_2Ljava_lang_Object_2($e0);
    if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
        end = 0;
    }
    else
        throw $e0;
}
finally {
    (end == 0 || end > this$static.PCSTC_client_NTDataSource_total) && (end = this$static.com_PCSTC_client_NTDataSource_total);
}

getAttributeAsIntは undefined を返すので、java_lang_Integer_valueは存在しません。これにより、キャッチされる例外が発生します。$e0 例外オブジェクトが構築され (stacktrace とすべて)、java_lang_Exception に対するチェックはtrueを返すため、end変数は 0 に設定されます。問題は、実行される次の行が throw $e0; であることです。
これは無意味であるだけでなく、try/catch/finally ブロックの実行後に、キャッチされていない例外があります。つまり、処理したばかりの例外です! False : Update3
を参照 問題は、if ステートメントの両方の分岐が実行される原因と、それを回避するにはどうすればよいかということです。
システムの詳細: GWT SDK 2.5.1 および SmartGWT 3.1p を使用する Windows Server 2008 R2 SP1 上の FF 20.0

ありがとう、
フロー。

アップデート

スタックトレース:

"com.google.gwt.core.client.JavaScriptException: (TypeError) 
 fileName: http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html
 lineNumber: 335
 stack: PCSTC_client_NTDataSource_$executeFetch__LPCSTC_client_NTDataSource_2Ljava_lang_String_2Lcom_smartgwt_client_data_DSRequest_2Lcom_smartgwt_client_data_DSResponse_2V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:335
PCSTC_client_GwtRpcDataSource_transformRequest__Lcom_smartgwt_client_data_DSRequest_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:326
com_smartgwt_client_data_DataSource_onInit__V/self.transformRequest<@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:268
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
isc_DataSource_getServiceInputs@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:463
isc_DataSource_sendDSRequest@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:665
isc_DataSource_performDSOperation@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:647
isc_DataSource_fetchData@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:621
isc_ResultTree_loadChildren@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1366
isc.A.changeDataVisibility@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
isc_Tree_openFolder@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90
isc_Tree_setRoot@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:46
isc_Tree_init@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:25
isc_c_Class_invokeSuper@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
isc_ResultTree_init@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1357
isc_Class_completeCreation@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:263
isc_c_Class_create@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:169
isc_Canvas_createResultTree@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1415
isc_TreeGrid_createDataModel@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1479
isc_Canvas_filterWithCriteria@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2400
isc_Canvas__filter@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2399
isc_c_Class_invokeSuper@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225
isc_c_Class_Super@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:218
isc_ListGrid__filter@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:1589
isc_Canvas_fetchData@http://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2381
PCSTC_client_SGWT_updateTreeGrid__LPCSTC_client_SPCManager_2V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:459
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
@http://127.0.0.1:8888/SGWT.html:46
jQuery.event.dispatch@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3074
jQuery.event.add/elemData.handle@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2750
jQuery.event.trigger@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2986
.trigger/<@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3677
.each@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:648
jQuery.prototype.each@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:270
.trigger@http://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3676
com_google_gwt_lang_EntryMethodHolder_init__V@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:983
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_Object_2@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:621
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594
gwtOnLoad@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10220
maybeStartModule@http://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:40
PCSTC_SGWT.onScriptLoad@http://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:278
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10228

更新 2
このコードは開発モードではなく本番モードで実行されることを言及する必要がありました。したがって、これはブラウザの VM の Java コードではなく、JavaScript コード (FB でデバッグ) の動作です。

更新 3
退屈な部分: この意図しない try/catch/finally ステートメントの次の行で、まったく同じ例外が生成されます。私はすぐに判断しました:私はそれが私が処理したばかりの例外であると推測しました. そうではありません。したがって、try/catch/finally ブロックの実行後にキャッチされていない例外があるというステートメント: 処理したばかりの例外は false です。
興味深い点: if ステートメント内と、finally ステートメントの直後に、次のようにいくつかのアラートを配置しました。

1 end = 0;
2 try {
3   end = com_smartgwt_client_util_JSOHelper_getAttributeAsInt__Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_String_2Ljava_lang_Integer_2(request.com_smartgwt_client_core_JsObject_jsObj, 'endRow').java_lang_Integer_value;
4 }
5 catch ($e0) {
6   $e0 = com_google_gwt_lang_Exceptions_caught__Ljava_lang_Object_2Ljava_lang_Object_2($e0);
7   if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
8       alert("then");
9       end = 0;
10  }
11  else {
12      alert("else");
13      throw $e0;
14  }
15 }
16 finally {
17     (end == 0 || end > this$static.PCSTC_client_NTDataSource_total) && (end = this$static.PCSTC_client_NTDataSource_total);
18 }
19 alert("outside");

強調表示 (および実行) の順序は、1、2、3、5、6、7、8、9、10、13、17、13、19です。私が理解していないのは、この行で何が起こっているかです: throw $e0; . まず、この行が実行されるとは思っていませんでした。しかし、そうなので、$e0 がスローされることを期待していますが、明らかにそうではありません。もう 1 つの「癖」は、12 行目のalert("else");という事実です。実行されることはありません。

全体として、スクリプトのこの部分をデバッグしなければ、すべて問題ないと思っていたでしょう。実際の結果は期待どおりです。例外が発生した場合に finally 部分を実行するかどうかです。私の側からの重大な見落としと相まって、私は実際にこのスレッドを閉じると思います.

throw ステートメントの実行に関するコメントをいただければ幸いです。

ありがとう、フロー。

4

1 に答える 1

1

else前がありthrow $e0ます。コードが if-then-block に入るとは思わないが、else-block に行く。

if (com_google_gwt_lang_Cast_instanceOf__Ljava_lang_Object_2IZ($e0, Q$java_lang_Exception)) {
    alert("reachable?"); // put this line and run your app again.
    end = 0;
}
else
    throw $e0;

SmartGWT/GWT は、Java ランタイム ライブラリのサブセットのみをエミュレートすることに注意してください。 https://developers.google.com/web-toolkit/doc/1.6/RefJreEmulation

あなたの場合、DSResponse.getEndRow()long (定数)から変換された整数を返そうとしますDSRequest.ENDROW_UNSET。スタック トレースによると、GWT は JavaScriptException をスローします。

JavaScriptException は java.lang パッケージのタイプではなく、おそらく GWT サポート テーブルに含まれていません。if 条件が真でない場合、else ブロックがトリガーされます。

于 2013-05-23T15:53:36.697 に答える