Метод ByteArrayInputStream read () создает исключение IndexOutOfBoundsException - PullRequest
0 голосов
/ 10 февраля 2012

Это должен быть простой вопрос для опытных людей здесь. Я новичок в Java, поэтому пытаюсь решить эту проблему уже несколько часов. Я изучаю Java, выполняя практическую работу, я прочитал все, что мог о массивах и распределении памяти, но, вероятно, я все еще чего-то не понимаю.

Я пишу этот метод, который в основном использует исходный текст, например «bla bla bla search entry bla bla bla» и должен выделять строку поиска, возвращая строку типа «bla bla bla {font = red} search entry {/ 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();
            }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

проблема была в том, что вместо

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

я должен был использовать

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

, похоже, что второй параметр всегда должен быть 0, несмотря на то, что написано в документ .

0 голосов
/ 10 февраля 2012

Если эта строка:

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

создает исключение границ, сообщая, что вы допустили ошибку при вычислениях индекса. Другими словами, индексы от posB до posE - 1 не все в пределах buffer.


Это должен быть простой вопрос для опытных людей здесь.

Вы будете удивлены. Это трудно, потому что:

  • ваш код грязный и трудно читаемый,
  • логика вашего кода безобразна и полна необъяснимых жестких констант,
  • ваш код неполон и содержит очевидные ошибки компиляции, а
  • ваше описание того, что вы пытаетесь сделать, трудно прочитать / понять

Короче это ужасно.

Так что, как опытный программист, я собираюсь предложить вам бросить его и переписать с нуля. (Если бы мне пришлось проверять код, я бы отклонил его как явно не поддерживаемый, независимо от того, «работал» он или нет.)

Если это слишком много, вам нужно научиться пользоваться отладчиком.

И последний совет: разбивать байтовые текстовые данные в Java просто безумие. Рассматривайте его как символьную, и вы можете использовать целый ряд мощных и (если разумно) эффективных библиотек классов, начиная с String / StringBuilder и переходя к сканерам, форматерам и регулярным выражениям.

...