`
雨过天晴0521
  • 浏览: 159338 次
  • 性别: 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脚本测试语法是否正确, 观察输出
分享到:
评论

相关推荐

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

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

    IE调试JS插件

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

    前端二选一作答即可.rar

    如果已有JavaScript基础,可以考虑深入学习一个框架如React或Vue.js;如果想要提升CSS编写效率,Sass和Less都是好选择;对于项目构建,Webpack适合大型项目,而Parcel适合快速开发。无论你选择哪一项,确保投入足够...

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

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

    2345网址导航源码 3.3.rar

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

    由亿起发(eqifa.com)的页面发现顶部的http://16a.us/8.js想到的js解密 <font color=red>原创</font>第1/3页

    - 可以观察到,传给eval的参数是一个加密后的字符串,通过一系列的转换最终解析成一个可执行的JavaScript函数体。 - 此过程涉及到了字符串的处理、正则表达式的应用、以及通过替换过程解码出可执行代码的逻辑。 4...

    IE下js调试工具Companion.JS

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

    浅谈Vue.js 关于页面加载完成后执行一个方法的问题

    在Vue.js中,当涉及到页面加载完成后执行一个特定方法时,通常有几种常见的处理方式。本文将详细讨论这个问题,提供两种解决策略,并通过具体的代码示例进行解释。 首先,我们可能会想到在`mounted`或`created`生命...

    Atom-ganymede,一个让我想起木星的配色方案。通过在github上创建一个帐户,为charliewilco/ganymede的开发做出贡献。.zip

    Atom 是一个由 GitHub 开发的免费、开源的文本编辑器,它利用了现代 Web 技术如 HTML、CSS 和 JavaScript,使其具有高度可定制性和扩展性。这款配色方案的开发者Charlie Wilco将 Ganymede 的神秘色彩融入到 Atom 的...

    javascript 格式化工具

    - **JSBeautify**:一个轻量级的在线工具,可以快速地对JavaScript代码进行美化。 3. **使用方式** - **命令行接口 (CLI)**:大多数格式化工具都提供了命令行工具,可以集成到构建流程中,如`prettier --write .`...

    javascript-whatever:无论我想到什么JavaScript

    标题“javascript-whatever”可能暗示这是一个个人项目或者集合,包含作者关于JavaScript的各种想法和实验。这种类型的项目通常会包括各种示例代码、技巧、最佳实践或对JavaScript特性的独特见解。 描述中的“无论...

    ExtAspNet_v2.3.2_dll

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

    EXT2.0中文教程

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

    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,当时改六种类型少改了一个随机数,因为年代久远就没敢再改动,还有几行注释没有详细比如六种类型而不是五种,还有数字代表的具体类型少了两个注释,但是不影响...

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

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

    winform实现Echart统计图(基于webBrowser).zip

    ECharts是百度开发的一个开源JavaScript库,提供了丰富的图表类型和交互功能,非常适合在网页中展示数据。在Winform应用中集成ECharts,可以通过嵌入WebBrowser控件来实现,让桌面应用也能享受到Web图表的优势。 本...

    PyPI 官网下载 | webdnn-1.2.4.tar.gz

    在提到“zookeeper”时,我们可能想到的是Apache ZooKeeper,这是一个分布式协调服务,用于管理大量的分布式系统。尽管WebDNN自身并不直接依赖ZooKeeper,但在大型分布式系统中,ZooKeeper可以用来管理WebDNN服务的...

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

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

Global site tag (gtag.js) - Google Analytics