执行IF语句的两个分支

时间:2013-05-22 08:48:37

标签: javascript gwt smartgwt

在尝试为SmartGWT的TreeGrid创建自定义数据源时,我发现自己处于一种非常奇怪的境地。在检索请求的EndRow属性时,我发现,如果它不存在,getEndRow函数将不会返回null(或预定义的默认值,-1就足够了)但它会抛出异常,因为它尝试将属性的值转换为int(javascript: undefined .java_lang_Integer_value)。我能做的最好的事情就是把所有东西都放在try catch中,并让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. 问题是将要执行的下一行是抛出$ e0;
不仅如此,没有任何感觉,但在执行try / catch / finally块后,我有一个未被捕获的异常:我刚刚处理的异常! 错误:请参阅 Update3
问题是:是什么导致执行if语句的两个分支,我该如何避免它?
系统详细信息:带有GWT SDK 2.5.1和SmartGWT 3.1p的Windows Server 2008 R2 SP1上的FF 20.0

谢谢,
FLO。

更新

stacktrace:

"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
我应该提到这个代码在生产模式下运行,而不是在开发模式下运行,因此这是javascript代码(用FB调试)的行为而不是浏览器VM中的java代码。

更新3
无聊的部分:这个意外的try / catch / finally语句之后的下一行产生完全相同的异常。我只是要快速判断:我认为这是我刚刚处理的例外。事实并非如此。因此,在执行try / catch / finally块之后的语句我有一个未被捕获的异常:我刚刚处理的异常是假的。
有趣的部分:我在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。我不明白的是这一行发生了什么:抛出$ e0; 。首先,我没想到这条线会被执行。但事实是,所以我希望抛出$ e0,但显然不是。另一个“怪癖”是第12行 alert(“else”); 永远不会被执行。

总而言之,如果我不调试脚本的这一部分,我会认为一切正常,实际上结果是预期的:在发生异常的情况下执行finally部分。结合我方的严重疏忽,我想我实际上会关闭这个帖子。

我非常感谢您对throw语句执行的评论。

谢谢, FLO。

1 个答案:

答案 0 :(得分: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()尝试返回一个Integer,它从long(常量DSRequest.ENDROW_UNSET)转换而来。根据您的堆栈跟踪,GWT抛出JavaScriptException。

JavaScriptException不是java.lang包的一种类型,它可能不在GWT支持表中。如果if条件不成立,则触发else块。