`
雨过天晴0521
  • 浏览: 154840 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由一个js错误想到的.

    博客分类:
  • java
 
阅读更多
背景知识:Java 6提供对执行脚本语言的支持,这个支持来自于JSR223规范,对应的包是javax.script。默认情况下,Java 6只支持JavaScript脚本,它底层的实现是Mozilla Rhino,它是个纯Java的JavaScript实现。
详见: http://developer.51cto.com/art/201007/208812.htm



昨天运行ant脚本时触发了macros.js里这样一个js error: Uncaught TypeError: Cannot call method 'join' of undefined.

根据错误的line位置, 我查看了这个js

function concat(parts) {
    return parts.join('/');
}


很难看出来为什么红色这一行会有问题, 但以前没什么没发生呢. 什么地方的改动触发了这个error呢, 我今天的改动只不过是想把下面SilverFabricSDK和DSServer的version和location由4.1.0改为5.0.1, 就这么一个细小的改动跟上面的js有哪门子关系? 看上面js报错的地方实在是没头绪.

    <target name="init">
        <init />
        <require name="sf-common" when="compile-and-runtime" type="jar"
            version="${common_rel_ver}" build-number="${common_build_num}" location="${common.gridlib.dir}"/>

        <require name="commons-io" when="compile-and-runtime" type="plain-jar"
            version="2.0" location="${basedir}/../../common/lib/thirdparty"/>

        <require name="json" when="runtime" type="plain-jar"
            version="20080701" location="${basedir}/../../common/lib/thirdparty"/>

        <require name="SilverFabricSDK" when="compile" type="plain-jar"
            version="5.0.1" location="${basedir}/../../common/lib/sf/5.0.1"/>

        <require name="DSServer" when="test" type="plain-jar"
            version="4.1.0" location="${basedir}/../../common/lib/sf/4.1.0"/>

...
...
...



于是在js中打印一下parts试试看, 到底是个什么东西.


function concat(parts) {
java.lang.System.out.println("**" + parts.toString());
    return parts.join('/');
}


在没错误情况下打印会看得更清楚, 于是先把版本号改回4.1.0, 打印的结果显示原来是把location下的jar文件和版本号拼在一起, 拼成${basedir}/../../common/lib/sf/4.1.0/SilverFabricSDK-4.1.0.jar, 如果location下有这个文件就ok, 没有就会出现上面的error. 于是我又去${basedir}/../../common/lib/sf/5.0.1的下面, 发现SilverFabricSDK.jar这个jar原来不含版本号, 换句话说, 跟没本有${basedir}/../../common/lib/sf/5.0.1/SilverFabricSDK-5.0.1.jar

其实真正引起错误原因的位置并不是显示错误的哪一个行, 而是在下面这一个行时, 传入的参数就已经出问题了:
add_element(path, filename, true);

由于上面找的${basedir}/../../common/lib/sf/5.0.1/SilverFabricSDK-5.0.1.jar不存在, 所以parts实际的类型是不是期望的字符串数组, 而是布尔类型, 因为JavaScript 拥有动态类型,换句话说,相同的变量可用作不同的类型. 布尔类型自然没有数组的join()这个方法, 所以报Cannot call method 'join' of undefined.

function add_element(path, parts, required) {
    file = new File(concat(parts));

    if (required) {
        file.exists() || self.fail('File [' + file.getAbsolutePath() + '] does`t not exist');

        element = path.createPathElement();
        element.setLocation(file);
    } else {
        if (file.exists()) {
            element = path.createPathElement();
            element.setLocation(file);
        }
    }
}

 filename = exists([location, name + '-' + relVer + '.jar']) || exists([location, name + '_' + relVer + '.jar']);
        add_element(path, filename, true);




最后还有一点补充, 如果这样打印

function concat(parts) {
java.lang.System.out.println(parts);
    return parts.join('/');
}

会遇到这样的Exception,

D:\cloudteam\SFAMX\bpm-server\container\build.xml:16: javax.script.ScriptExcepti
on: sun.org.mozilla.javascript.internal.EvaluatorException: Cannot convert sun.o
rg.mozilla.javascript.internal.NativeArray@7a1576 to char[] (<Unknown source>#13
9) in <Unknown source> at line number 139

其实本质上还是js类型的问题, 由于parts不出错情况下是js的字符串数组类型, 而java.lang.System.out.println()的参数是java的char[]类型, 这两个类型没法直接直接转化, 所以必须把parts.toString()或者用"+"连接一个字符串类型, 即java.lang.System.out.println("**"+parts); 这样parts才能从js数组类型转化成字符串类型, 供java.lang.System.out.println()使用.



PS:jdk6有一个命令行工具:jrunscript
cd到jire的bin目录,默认为javascript语言,可以直接输入单行js脚本测试语法是否正确, 观察输出
分享到:
评论

相关推荐

    微信小程序 加载 app-service.js 错误解决方法

    微信小程序开发过程中出现错误,经过一番思考解决此问题,这里给大家提醒下!...感觉很奇怪,然后忽然想起前几天新建了一个一样的项目名称,所以才出现上面的报错。 于是重新命名一个,就没有这个问

    一个IE下的优秀js调试工具(附安装步骤)

    在Firefox下还有firebug,这的确是一个不错的js调试工具,但在IE下使用就很麻 烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到...

    IE调试JS插件

    这的确是一个不错的js调试工具,但在IE下使用就很麻 烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工 具,不敢私藏...

    2345网址导航源码 3.3.rar

    之前答复你们一个月能下来的真是不好意思,没想到比想象的复杂、文件众多,一始既往完美高仿、纯净、无插件、无乱码;谢谢你们,希望你们使用愉快! 2345简介:2345网址导航目前用户超过3000万。截止到2011年8月...

    Custom-JavaScript-for-Websites-2:在任何网站上运行自定义JavaScript

    网站的自定义JavaScript 在任何网站上运行自定义JavaScript。 使用此工具可以在任何网站中注入自定义JavaScript。... 现在只有一个功能: customjsReady customjsReady ( '.nav' , function ( element ) {

    IE下js调试工具Companion.JS

    这的确是一个不错的js调试工具,但在IE下使用就很麻烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工具,不敢私藏,...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了IE下Grid中的一个JS问题(feedback:lqm4108)。 -修正Alert消息中引号未编码导致的JS错误(feedback:sun1299shine)。 +集成extjs3.0.3。 -修正弹出对话框的宽度计算错误(会保持最小的状态)。 -增加新的...

    EXT教程EXT用大量的实例演示Ext实例

    2.2. 让我们搞一个grid出来耍耍吧。 2.3. 上边那个是1.x的,2.0稍微有些不同哦 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. 让grid支持按列排序 2.5. 让单元格里显示红色的字,图片...

    EXT2.0中文教程

    2.2. 让我们搞一个grid出来耍耍吧。 2.3. 上边那个是1.x的,2.0稍微有些不同哦 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. 让grid支持按列排序 2.5. 让单元格里显示红色的字,图片,...

    ExtAspNet_v2.3.2_dll

    -修正了IE下Grid中的一个JS问题(feedback:lqm4108)。 -修正Alert消息中引号未编码导致的JS错误(feedback:sun1299shine)。 +集成extjs3.0.3。 -修正弹出对话框的宽度计算错误(会保持最小的状态)。 -增加新的...

    ie 调试javascript的工具

    这的确是一个不错的js调试工具,但在IE下使用就很麻烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工具,不敢私藏,...

    Ext 开发指南 学习资料

    2.2. 让我们搞一个grid出来耍耍吧。 2.3. grid默认自带的功能 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. 让grid支持按列排序 2.4.3. 中文排序是个大问题 2.5. 让单元格里显示红色的字...

    俄罗斯方块完整版

    当时写的时候里面还有一处错误,Square.js中44行应该是*6,当时改六种类型少改了一个随机数,因为年代久远就没敢再改动,还有几行注释没有详细比如六种类型而不是五种,还有数字代表的具体类型少了两个注释,但是不影响...

    Javascript 读取操作Sql中的Xml字段

    在一个项目当中,我们需要把数据库中的Xml字段中的信息表现在页面中,如果用Sql进行操作,读取。这样的话,必然导致太复杂,于是我想到了,如果把Xml字段先读出来,然后用Js去操作,这样岂不是简单了许多,于是网上...

    ya-school-shri-2018-1:“发现错误”-接口开发学院的入门作业

    首先想到的是检查控制台以检查最明显的错误。 控制台说initMap模块被错误地导入。 发生原因语法错误。 导入initMap模块时,其名称周围没有花括号。 尽管可以导入模块,但是只有在默认情况下从其导入文件的模块中...

    JavaScript Table行定位效果

    接着想到的是给table插入一个新tr,克隆原来的tr,并设置这个tr为fixed(ie6为absolute),例如: Code &lt;!DOCTYPE ...

    为网站2定制JavaScript。「Custom JavaScript for Websites 2」-crx插件

    *站点调试(错误的列表排序等)*从网站中提取有用的信息,例如账单/订单元数据*隐藏烦人的弹出窗口和广告*自定义UI *您能想到的所有方法:)新功能:Ace Editor(格式化,突出显示,通过热键撤消/重做)草稿自动保存...

    从parcel.js打包出错到选择nvm的全部过程

    我在使用parcel.js打包项目的时候出现了下面的错误: 我在仔细检查完代码并且核实项目配置没有问题后,没办法只能求助万能的Google,结果在GitHub上找到了错误的原因,parcel.js使用了Async 函数,默认Node.js 8...

    易创地方生活门户系统(lifecms) 2011 SP3 GBK.zip

    [修复]删除某一个自定义$DIRCMS变量时,其他自定义变量也删除的错误; [修复]模型字段无法批量修改的错误; [修复]管理后台首页在IE6下的JS调用错误; [修复]管理后台在IE6下CSS显示错误; [修复]栏目动态化时,...

    javascript原生封装一个淡入淡出效果的函数测试实例代码

    说到js的渐变显示与消失,多数朋友会想到JQuery里面的fadeIn()、fadeOut()或fadeToggle()。但如果仅仅是为了引入这样的一个效果,而去调用了庞大JQuery库?或者说我通过用原生js实现一些函数来提高自己~ 所以,我...

Global site tag (gtag.js) - Google Analytics