Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ByteArrayInputStream read()方法引发IndexOutOfBoundsException_Java_Android_Bytearrayinputstream - Fatal编程技术网

Java ByteArrayInputStream read()方法引发IndexOutOfBoundsException

Java ByteArrayInputStream read()方法引发IndexOutOfBoundsException,java,android,bytearrayinputstream,Java,Android,Bytearrayinputstream,对于这里有经验的人来说,这应该是一个简单的问题。我是Java初学者,所以我已经尝试解决这个问题好几个小时了。 我正在通过实际工作学习Java,我已经尽可能地阅读了关于数组和内存分配的内容,但可能我仍然不懂一些东西 我写的这个方法基本上是以源文本为基础的,比如blablabla搜索条目bla bla bla bla bla,应该通过返回类似bla bla bla{font=red}搜索条目{/font}bla bla bla的字符串来突出显示搜索条目。 如果源文本是英文的,没有问题,前半部分的功能

对于这里有经验的人来说,这应该是一个简单的问题。我是Java初学者,所以我已经尝试解决这个问题好几个小时了。 我正在通过实际工作学习Java,我已经尽可能地阅读了关于数组和内存分配的内容,但可能我仍然不懂一些东西

我写的这个方法基本上是以源文本为基础的,比如blablabla搜索条目bla bla 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();
            }
如果此行:

   baIn.read(buffer, posB, posE-posB);
是抛出边界异常,它告诉您在索引计算中犯了错误。换句话说,posB到posE-1的索引并不都在缓冲区内

对于这里有经验的人来说,这应该是一个简单的问题

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

你的代码凌乱难懂, 你的代码逻辑是丑陋的,充满了难以解释的硬连接常量, 您的代码不完整,并且包含明显的编译错误,并且 你对你要做的事情的描述很难理解 简言之,这是可怕的

作为一个有经验的程序员,我建议你扔掉它,从头开始重写。如果我必须对它进行代码审查,我会直接拒绝它,因为它显然无法维护,不管它是否有效

如果这太难忍受,您需要学习使用调试器


最后一条建议是,在Java中对文本数据进行字节攻击是疯狂的。将其视为基于字符的类库,您可以使用一整套功能强大且使用起来非常有效的类库,从String/StringBuilder开始,到扫描仪、格式化程序和正则表达式。

问题在于

baIn.read(buffer, posB, posE-posB);
我应该用

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

看起来第二个参数必须始终为0,不管在中写了什么。

问题似乎在这几行posB=Integer.valueOfsrchArray[j+2];和posE=posB+整数。数组[j+3]的值。您似乎正在访问不存在的srchArray元素。在哪一行出现异常?请重新访问您以前的问题,并检查您是否可以接受某些答案。这将鼓励人们提供更多的帮助。我重新审视了我的老问题。谢谢你。我没有注意到每个答案旁边都有一个灰色的大勾号,现在我应该没事了。这些行很好,异常发生在该//**********之后的下一行,这是它抛出异常的地方:*******谢谢Stephen。我知道它太满了。我只是想让它做我需要的。我之所以不将其视为字符串,是因为我有fts sqlite搜索,它会返回包含文本中搜索条目位置的字符串。现在,我需要操纵文本,以便大纲搜索条目。我不得不使用ByteArray流类,因为偏移量是以字节为单位测量的,但是字符串中的文本是使用2个字节和1个字节作为空间编码的,这使得无法将这些偏移量与字符串类一起使用