错误无法调用脚本值中 null 的方法 "substring" - PDI

Error Cannot call method "substring" of null in Script Values - PDI

我正在使用 PDI Spoon 并在 Script Values 中编写此脚本以获取值、检查和转换:

var cte;
cte = gera_cte (CTRC.getString(), Numero_CTe.getString());
function gera_cte (arg1, arg2)
{
    if (arg2 == 0) {
        return arg1.substring(3,9); 
    }
    else 
    {
        return arg2.substring(4,10); 
    }    
}

但是当脚本读取最后一条记录时,会发生这种情况:

2016/02/05 17:28:40 - Gera Num Cte.0 - ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : Erro inesperado
2016/02/05 17:28:40 - Gera Num Cte.0 - ERROR (version 5.0.1-stable, build 1 from 2013-11-15_16-08-58 by buildguy) : org.pentaho.di.core.exception.KettleValueException: 
2016/02/05 17:28:40 - Gera Num Cte.0 - Javascript error: 
2016/02/05 17:28:40 - Gera Num Cte.0 - TypeError: Cannot call method "substring" of null (script#12)
2016/02/05 17:28:40 - Gera Num Cte.0 - 
2016/02/05 17:28:40 - Gera Num Cte.0 -     at org.pentaho.di.trans.steps.scriptvalues_mod.ScriptValuesMod.addValues(ScriptValuesMod.java:457)
2016/02/05 17:28:40 - Gera Num Cte.0 -     at org.pentaho.di.trans.steps.scriptvalues_mod.ScriptValuesMod.processRow(ScriptValuesMod.java:692)
2016/02/05 17:28:40 - Gera Num Cte.0 -     at org.pentaho.di.trans.step.RunThread.run(RunThread.java:60)
2016/02/05 17:28:40 - Gera Num Cte.0 -     at java.lang.Thread.run(Unknown Source)
2016/02/05 17:28:40 - Gera Num Cte.0 - Caused by: org.mozilla.javascript.EcmaError: TypeError: Cannot call method "substring" of null (script#12)

我该如何解决这个问题,因为在文件末尾?

您的文件中可能有一个额外的行,这使得它 运行 具有 null 值。

您可能应该在非法行到达您的 Java 脚本步骤之前过滤掉它们,或者使用类似以下内容检查函数中的输入值:

function gera_cte (arg1, arg2)
{
    if (arg1 == null) {
        return arg1;
    }
    if (arg2 == 0) {
        return arg1.substring(3,9); 
    }
    else 
    {
        return arg2.substring(4,10); 
    }    
}

或当参数为空时设置trans_Status = SKIP_TRANSFORMATION;

如果您使用 "Modified Javascript Value" 步骤执行此脚本,则会出现此错误,因为 PDI 使用的 javascript 引擎(Mozilla 的 Rhino 引擎)没有 "substring"方法。尝试使用 "substr" 代替:

// Perform the substring function
// 
// Usage:
// substr(var, from);
// substr(var, from, to);
//
// 2007-01-25
//
var str1= "Hello Pentaho!";
var str2= substr(str1, 6);
var str3= substr(str1, 6, 7);
Alert("Input : " + str1);
Alert("From position 6: " + str2);
Alert("From position 6 for 7 long : " + str3);