2013-05-22 72 views
0

尝试为SmartGWT的TreeGrid创建自定义数据源时,发现自己处于一种非常特殊的状态。在检索请求的EndRow属性时,我发现如果它不存在,getEndRow函数将不会返回null(或者预定义的默认值,-1会足够好),但会引发异常,因为它会尝试转换为属性的值(javascript:undefined .java_lang_Integer_value)。我可以做的最好的事情是把所有东西都放在try catch中,并让finally块设置一个默认值。执行IF语句的两个分支

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回报不确定,所以java_lang_Integer_value不存在。这会导致被捕获的异常。 $ e0异常对象构造(stacktrace和所有内容),对java_lang_Exception的检查返回true,所以结束变量设置为0. 问题是将要执行的下一行是throw $ e0;
不仅这样做没有感觉,而且在执行try/catch/finally块之后,我有一个未捕获的异常:我刚处理的异常! False:see Update3
问题是:什么导致if语句的两个分支的执行以及如何避免它?
系统细节:在Windows Server 2008上的FF 20.0 R2 SP1与GWT SDK 2.5.1和SmartGWT的3.1p

谢谢
弗洛。

UPDATE

堆栈跟踪:

"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[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:335 
PCSTC_client_GwtRpcDataSource_transformRe[email protected]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_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571 
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:609 
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:463 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:665 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:647 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:621 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1366 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:90 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:46 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:25 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1357 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:263 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:169 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1415 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_DataBinding.js:1479 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2400 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2399 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:225 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:218 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Grids.js:1589 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/sc/modules/ISC_Core.js:2381 
[email protected]tp://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:459 
com_google_gwt_core_client_impl_Impl_apply__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571 
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]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 
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3074 
jQuery.event.add/[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:2750 
[email protected]://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 
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:648 
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:270 
[email protected]://127.0.0.1:8888/js/lib/jquery-1.9.1.js:3676 
[email protected]://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[email protected]://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:571 
com_google_gwt_core_client_impl_Impl_entry0__Ljava_lang_Ob[email protected]http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:621 
@http://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:594 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/95B8D29626B94496F815FE8CECC681AC.cache.html:10220 
[email protected]://127.0.0.1:8888/PCSTC.SGWT/PCSTC.SGWT.nocache.js:40 
[email protected]://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块之后的声明我有一个未捕获的异常:我刚刚处理的异常为false。
有趣的部分:我放了一些警告的if语句后,立即在最后陈述中,像这样:

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,,17,,19。我不明白的是这条线发生了什么:throw $ e0;。首先我没有想到这条线会被执行。但事实是,所以我期望$ e0被抛出,但显然不是。另一个“怪癖”是,第12行alert(“else”);永远不会执行。总而言之,如果我不想调试这部分脚本,我会认为一切正常,实际上结果是预期的结果:在出现异常时执行finally部分。结合我身边的总体监督,我想我会真的关闭这个线程。

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

谢谢, Flo。

+0

你可以包含你提到的堆栈跟踪吗? –

回答

1

throw $e0之前有一个else。我不相信代码进入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()试图返回一个整数,它是由一个长(恒定DSRequest.ENDROW_UNSET)转换。根据你的堆栈跟踪,GWT抛出一个JavaScriptException。

JavaScriptException不是一种java.lang包,它可能不在GWT支持表中。 if条件不成立,else-block被触发。

+0

我对SmartGWT/GWT了解不多,但是您的回答比执行“if”和“else”分支更有意义。 –

+0

明天早上我会在那里提醒一下,只是100%确定'then'分支被执行。但我可以肯定地说,Firebug显示_end = 0_行的执行,并且由FB(并执行)高亮显示的下一行是throw _ $ e0_。我在控制台中检查了if语句,并将其解释为_true_(因为它应该是。所有异常派生自java.lang.exception,所以我期望映射的javascript异常尊重这个层次结构) – Flo

+0

@Flo,你最好试试chrome和msie。他们都有很好的调试工具。我担心FB没有正确解释JS代码。 – stanleyxu2005