{"record":{"id":"a388b3cf41858514","repo":"pentaho/pentaho-kettle","slug":"row-errordeserializing","errorCode":null,"errorMessage":"Row.ErrorDeserializing","messagePattern":"Row\\.ErrorDeserializing","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/compatibility/Row.java","lineNumber":942,"sourceCode":"    try {\n      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n      DataOutputStream dataOutputStream = new DataOutputStream( byteArrayOutputStream );\n      row.writeData( dataOutputStream );\n      dataOutputStream.close();\n      byteArrayOutputStream.close();\n      return byteArrayOutputStream.toByteArray();\n    } catch ( Exception e ) {\n      throw new RuntimeException( BaseMessages.getString( PKG, \"Row.ErrorSerializing\" ) + row, e );\n    }\n  }\n\n  public static final Row getRow( byte[] data, Row metadata ) {\n    try {\n      ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( data );\n      DataInputStream dataInputStream = new DataInputStream( byteArrayInputStream );\n      return new Row( dataInputStream, metadata.size(), metadata );\n    } catch ( Exception e ) {\n      throw new RuntimeException( BaseMessages.getString( PKG, \"Row.ErrorDeserializing\" ), e );\n    }\n  }\n\n  /**\n   * @return the usedValueListeners\n   */\n  public List<ValueUsedListener> getUsedValueListeners() {\n    return usedValueListeners;\n  }\n\n  /**\n   * @param usedValueListeners\n   *          the usedValueListeners to set\n   */\n  public void setUsedValueListeners( List<ValueUsedListener> usedValueListeners ) {\n    this.usedValueListeners = usedValueListeners;\n  }\n","sourceCodeStart":924,"sourceCodeEnd":960,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/compatibility/Row.java#L924-L960","documentation":"The 3-argument form of substr wraps any exception raised while computing substring(from, from+len) into this Rhino runtime error with e.getMessage() appended. Even though negative start has its own guard, failures such as a non-numeric length (NaN), a non-convertible string argument, or an internal conversion error surface here. The 'to' index is clamped to the string length, so most numeric inputs should pass - failures indicate conversion problems.","triggerScenarios":"Calling substr(str, start, len) with 3 arguments where Context.toNumber fails for start or len (NaN causing invalid substring bounds), or the first argument cannot be converted to a string.","commonSituations":"Passing empty/null fields that convert to NaN; passing a numeric string with locale-specific decimal separators; passing a JavaScript object as the length argument.","solutions":["Ensure start and len are finite numbers: substr(str, Number(start), Number(len)).","Guard the input string: if (str == null) str = ''.","Validate len is not NaN: var l = isNaN(len) ? 0 : len; before calling.","Use native JavaScript slice/substring for standard semantics."],"exampleFix":"// before\nsubstr(value, startField, lenField); // lenField may be empty -> NaN\n// after\nvar s = String(value == null ? \"\" : value);\nsubstr(s, parseInt(startField, 10) || 0, parseInt(lenField, 10) || 0);","handlingStrategy":"validation","validationCode":"var s = String(str == null ? \"\" : str);\nvar st = Number(start) || 0;\nvar ln = isNaN(Number(len)) ? 0 : Math.round(Number(len));","typeGuard":"function isFiniteNumber(x) { return typeof x === \"number\" && isFinite(x); }","tryCatchPattern":"var r;\ntry {\n  r = substr(s, st, ln);\n} catch (e) {\n  r = \"\";\n}","preventionTips":["Verify len is not NaN from empty fields","Use parseInt/Number on incoming fields before substring math","Null-guard the source string"],"tags":["javascript","string-processing","type-coercion","scripting"],"backgroundTag":"invalid-argument-value","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}