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 ステートメントの実行に関するコメントをいただければ幸いです。
ありがとう、フロー。