代码之家  ›  专栏  ›  技术社区  ›  deinspanjer

如何在Nashorn中跟踪引用错误

  •  1
  • deinspanjer  · 技术社区  · 7 年前

    我遇到了一个问题,看起来它可能是Nashorn引擎中的某种错误,但我想不出一个好方法来提取一个测试用例来演示它。

    我有一段代码(以前是可以工作的!)大致如下所示:

    'use strict';
    function Dummy() {
      this.val = 'I am fubar';
      this.aContainer = [];
    }
    Dummy.prototype.toString = function() { return JSON.stringify(this);};
    
    let obj = {};
    obj.aMethod = function(arg) {
      let fubar = new Dummy();
      print('Okay so far');
    
      fubar.aContainer.push({"some":"thing"});
      print('Still okay');
      fubar.aContainer.push({"==": [{"var": "something_else"}, fubar.val]});
    
      return fubar;
    };
    
    print(obj.aMethod(null));
    

    jss --language=es6 -strict 不会崩溃。然而,在我的真实代码中,我得到了以下信息:

    jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "fubar" is not defined

    如果我按以下方式更改代码,它运行良好:

    'use strict';
    function Dummy() {
      this.val = 'I am fubar';
      this.aContainer = [];
    }
    Dummy.prototype.toString = function() { return JSON.stringify(this);};
    
    let obj = {};
    obj.aMethod = function(arg) {
      let fubar = new Dummy();
      print('Okay so far');
    
      fubar.aContainer.push({"some":"thing"});
      print('Still okay');
      let x = fubar.val;
      fubar.aContainer.push({"==": [{"var": "something_else"}, x]});
    
      return fubar;
    };
    
    print(obj.aMethod(null));
    

    我刚刚通过自动更新获得了一个新版本的Java,但我需要看看这段代码是否在其下运行。我当前在控制台上的版本是:

    ➜  ~ java -version
    java version "1.8.0_77"
    Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
    
    1 回复  |  直到 7 年前