2012-02-10 203 views
-2

对于这里的经验丰富的人来说,这应该是一个简单的问题。我是一名Java初学者,所以我一直试图解决这个问题已经好几个小时了。 我正在学习Java通过做实际工作,我已经读了我可以关于数组和内存分配,但可能我仍然不明白的东西。ByteArrayInputStream read()方法抛出IndexOutOfBoundsException

我正在写这种基本上采用源文本的方法,例如, “bla bla bla search entry bla bla bla”,并应通过返回“bla bla bla {font = red}搜索条目{/ font} bla bla bla”等字符串来突出显示搜索条目。 如果源文本是英文的,没有问题,函数的前半部分(我没有包含它)运行良好。 但是,如果源文本是双字节编码,我必须使用ByteArrayInputStream和ByteArrayOutputStream来做同样的事情。

下面是代码:

  sDebug=new String(retVal, "UTF-8"); 
      final String sHtml1="<font color='green'><b>"; 
      final String sHtml2="</b></font>"; 


      ByteArrayOutputStream baOut=new ByteArrayOutputStream(); 
      //retVal contains source text 
      ByteArrayInputStream baIn=new ByteArrayInputStream(retVal);); 

      try 
      { 
      //posB - where search entry begins in retVal 
      posB=Integer.valueOf(srchArray[j+2]); 
      //posE - where search entry ends in retVal 
      posE=posB+Integer.valueOf(srchArray[j+3]); 
      byte[] buffer=new byte[posB]; 
      //read from beginning till posB 
      baIn.read(buffer, 0, posB); 
      sDebug=new String(buffer, "UTF-8"); 

      baOut.write(buffer); 
      baOut.write(sHtml1.getBytes("UTF-8")); 

      sDebug=new String(baOut.toByteArray(), "UTF-8"); 

      buffer=new byte[posE-posB]; 

      //************************************************* 
      //*********THIS IS WHERE IT THROWS EXCEPTION:****** 
      baIn.read(buffer, posB, posE-posB); 
      baOut.write(buffer); 
      sDebug=new String(baOut.toByteArray(), "UTF-8"); 
      baOut.write(sHtml2.getBytes("UTF-8")); 
      sDebug=new String(baOut.toByteArray(), "UTF-8"); 
      buffer=new byte[retVal.length-posE]; 
      baIn.read(buffer, posE, retVal.length-posE); 
      baOut.write(buffer); 
      sDebug=new String(baOut.toByteArray(), "UTF-8"); 

      retVal=baOut.toByteArray(); 
      sDebug=new String(baOut.toByteArray(), "UTF-8"); 
      //sDebug=baOut.toString("UTF-8"); 
      } 
      catch(Exception e) 
      { 
       String err="Error: " + e.getMessage(); 
       Toast.makeText(Central.context, err, Toast.LENGTH_LONG).show(); 
      } 
+1

问题似乎出现在这些行上posB = Integer.valueOf(srchArray [j + 2]);和posE = posB + Integer.valueOf(srchArray [j + 3]); 。看来你正在访问不存在的srchArray元素。 – 2012-02-10 07:39:05

+0

异常发生在哪一行? – 2012-02-10 07:40:42

+1

请重新访问您的旧问题,并检查您是否可以接受一些答案。这会鼓励人们提供更多的帮助。 – 2012-02-10 07:43:43

回答

0

如果该行:

baIn.read(buffer, posB, posE-posB); 

被抛出越界异常,它告诉你,你犯了一个错误,用食指计算。换句话说,索引posBposE - 1并不都在buffer之内。


这应该是这里的有经验的人一个简单的问题。

你会感到惊讶。这是困难的,因为:

  • 你的代码是凌乱,难以阅读,
  • 你的代码的逻辑是丑陋的,充满莫名的硬连线的常量,
  • 你的代码是不完整的,包含了明显的编译错误,和
  • 你的你正在尝试做的描述是很难读/理解

总之它是可怕的。所以作为一个经验丰富的程序员,我会建议你抛出它,并从头开始重写它。 (如果我不得不对代码进行审查,我会直接拒绝它,因为它明显不可维护,无论它是否“工作”。)

如果这太难以承受,则需要学习使用调试器。

最后一条建议是,在Java中字节抨击文本数据是疯狂的。将其视为基于字符的形式,您可以使用一整套强大的(如果使用的话)高效的类库,从String/StringBuilder开始,然后移动到扫描仪,格式化程序和正则表达式。

+0

谢谢斯蒂芬。我知道这是非常棒的。我只是想让它做我需要的。我不把它当作字符串处理的原因是我有fts sqlite搜索,它会返回包含搜索条目在文本http://www.sqlite.org/fts3.html#section_4_1中的位置的偏移字符串。现在我需要操作文本,以便轮廓搜索条目。我不得不使用ByteArray流类,因为偏移量是以字节为单位进行测量的,但字符串中的文本使用2个字节和1个字节的空间进行编码,这使得无法将这些偏移量用于String类 – Ivan 2012-02-11 03:22:55

0

的问题是不是

baIn.read(buffer, posB, posE-posB); 

我应该用

​​

它看起来像第二个参数必须始终为0,尽管什么是写在doc

相关问题