GWT框架中无法捕获数组越界异常的问题求助
解决GWT中捕获数组越界异常的问题
这问题我之前迁移Applet到GWT时也踩过一模一样的坑!先给你掰扯清楚为啥原来的代码在Applet里正常跑,到GWT就直接把浏览器搞卡死了:
原生Java里,访问数组超出索引范围时会抛出ArrayIndexOutOfBoundsException,所以你的catch块能正常触发,把error设为true终止循环。但GWT是把Java代码编译成JavaScript运行的,而JavaScript访问数组不存在的索引不会抛出异常,只会返回undefined——这就导致你的try块永远不会报错,error一直是false,循环无限跑下去,浏览器直接陷入无响应,哪怕换成JavaScriptException也没用,因为根本没异常可抛。
最优解决方案:直接用数组的length属性
其实这种靠捕获异常获取数组长度的写法完全是反模式,原生Java里也不推荐这么用,更别说GWT了。直接用数组自带的length属性就能高效拿到长度:
int n_img = imageNames.length;
如果需要遍历数组元素(替代原来的循环逻辑)
如果你原来的循环不只是为了获取长度,还要逐个处理元素,那直接用基于长度的循环更靠谱:
int n_img = 0; while (n_img < imageNames.length) { String tmp = imageNames[n_img]; // 这里添加你对tmp的处理逻辑 n_img++; }
或者用for-each循环更简洁:
for (String tmp : imageNames) { // 处理每个元素 }
为啥不推荐继续用异常捕获的方式?
就算你硬要在GWT里模拟异常捕获的逻辑,也得手动在JavaScript层面做额外判断,不仅麻烦还影响性能,完全没必要——毕竟length是数组的原生属性,既高效又安全,比靠异常终止循环合理太多。
内容的提问来源于stack exchange,提问作者JensD
相关产品推荐
相关产品推荐

