StringIndexOutOfBoundsException Java错误

时间:2015-09-11 13:54:34

标签: java niagara-ax

public void onStart() throws Exception
{
  // start up code here
}enter code here

public void onExecute() throws Exception
{
  // execute code (set executeOnChange flag on inputs)
  String tmp = getInASCIIString().getValue();
  setOutCSVString(new BStatusString(AsciiToBinary(tmp)));
}

public void onStop() throws Exception
{
  // shutdown code here
}

public static String AsciiToBinary(String asciiString) throws Exception
{  
  String padding = "00000000";
  StringBuffer dataString = new StringBuffer();
  StringBuffer outCSV = new StringBuffer();
  StringTokenizer Values = new StringTokenizer(asciiString,",");
     while (Values.hasMoreTokens()) 
     {
        String bin = padding + Integer.toBinaryString(Integer.parseInt(Values.nextToken()));
        String reversedString = new StringBuffer(bin.substring(bin.length() - 8, bin.length())).reverse().toString();
        dataString.append(reversedString); 
     }
  try
  {
      char[] charArray = dataString.toString().toCharArray();
      for (int i = 1; i < charArray.length; i++) 
      {
        if (charArray[i] == '1')
        {
          outCSV.append(i+"");
          outCSV.append(',');
        } 
      } 
      if (outCSV.toString().length() > 1)  
      {
        return outCSV.toString().substring(0, outCSV.toString().length()-1);
      }
      else
      {
        return outCSV.toString();
      }
  }
  catch(StringIndexOutOfBoundsException e)
  {
    return ""; 
  }

}

我们使用Tridium-使用Java作为后端。这个程序似乎是随机的,偶尔会抛出一个错误。我只限于预先安装的软件包,包括:java.util,java.baja.sys,javax.baja.status,javax.baja.util,com.tridium.program

这就是为什么有些代码是使用它所使用的逻辑/函数编写的。无论如何 - 我无法弄清楚为什么这会引发错误。有什么想法吗?

  

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java at java.lang.String.charAt(String.java:658)

完整堆栈跟踪:

java.lang.StringIndexOutOfBoundsException: String index out of range: 15
 at java.lang.String.charAt(String.java:658)
 at com.korsengineering.niagara.conversion.BStatusNumericToStatusBoolean.changed(BStatusNumericToStatusBoolean.java:38)
 at com.tridium.sys.schema.ComponentSlotMap.fireComponentEvent(ComponentSlotMap.java:1000)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:902)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setDouble(ComplexSlotMap.java:1254)
 at javax.baja.sys.BComplex.setDouble(BComplex.java:666)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:294)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:246)
 at javax.baja.sys.BLink.propagatePropertyToProperty(BLink.java:593)
 at javax.baja.sys.BLink.propagate(BLink.java:523)
 at com.tridium.sys.engine.SlotKnobs.propagate(SlotKnobs.java:56)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:899)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setDouble(ComplexSlotMap.java:1254)
 at javax.baja.sys.BComplex.setDouble(BComplex.java:666)
 at javax.baja.status.BStatusNumeric.setValue(BStatusNumeric.java:66)
 at com.tridium.kitControl.conversion.BStatusStringToStatusNumeric.calculate(BStatusStringToStatusNumeric.java:161)
 at com.tridium.kitControl.conversion.BStatusStringToStatusNumeric.changed(BStatusStringToStatusNumeric.java:155)
 at com.tridium.sys.schema.ComponentSlotMap.fireComponentEvent(ComponentSlotMap.java:1000)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:902)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setString(ComplexSlotMap.java:1335)
 at javax.baja.sys.BComplex.setString(BComplex.java:668)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:295)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:246)
 at javax.baja.sys.BLink.propagatePropertyToProperty(BLink.java:593)
 at javax.baja.sys.BLink.propagate(BLink.java:523)
 at com.tridium.sys.engine.SlotKnobs.propagate(SlotKnobs.java:56)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:899)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setString(ComplexSlotMap.java:1335)
 at javax.baja.sys.BComplex.setString(BComplex.java:668)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:295)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:238)
 at javax.baja.control.BControlPoint.doExecute(BControlPoint.java:271)
 at auto.javax_baja_control_BStringWritable.invoke(AutoGenerated)
 at com.tridium.sys.schema.ComponentSlotMap.invoke(ComponentSlotMap.java:1599)
 at com.tridium.sys.engine.EngineUtil.doInvoke(EngineUtil.java:49)
 at com.tridium.sys.engine.EngineManager.checkAsyncActions(EngineManager.java:364)
 at com.tridium.sys.engine.EngineManager.execute(EngineManager.java:209)
 at com.tridium.sys.engine.EngineManager$EngineThread.run(EngineManager.java:691)

1 个答案:

答案 0 :(得分:1)

一旦您将outCSVString连接到您将其链接到的任何其他线表逻辑,您的程序对象外部就会发生一些事情。这很可能是由于您的AsciiToBinary方法返回了一个空字符串输出,而其他逻辑无法处理。

outCSVString连接到其上有StringWritable历史记录扩展名的StringCov对象,并查找历史记录在您看到异常的同一时间戳记录的值,确保您的ProgramObject正在生成您期望的输出。

关于您的AsciiToBinary方法,Tridium框架仅限于它提供的模块以及您可以导入的内容,但它确实与Apache Oro Regular Expression Tools Version 2.0.8打包在一起。搜索&#34; oro&#34;在Niagara帮助文件中获取更多信息。

根据我的经验,如果您使用带有替换的正则表达式来构建字符串,而不是自己标记和迭代字符串,那么outCSVString将始终遵循所需的格式。