2012-02-10 7 views
-2

これは経験豊富な人にとっては簡単な質問です。私はJavaの初心者ですので、私はすでに数時間この問題を解決しようとしています。 私は実際の仕事をしてJavaを勉強していますが、私は配列とメモリ割り当てに関して何ができるのか読んだことがありますが、おそらく私はまだ何かを理解していません。ByteArrayInputStream read()メソッドは、IndexOutOfBoundsExceptionをスローします

私は基本的にソーステキストを取るこのメソッドを書いています。 "bla bla bla search entry bla bla bla"とし、 "bla bla bla {font = red}検索エントリ{/ font} bla bla bla"のような文字列を返すことで検索エントリを強調表示する必要があります。 ソーステキストが英語の場合、問題はありません。機能の前半(私はそれを含んでいません)はうまくいきます。 しかし、ソーステキストが2バイトコードであれば、同じことをするには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要素にアクセスしているようです。 –

+0

例外はどの行で発生しますか? –

+1

古い質問に再度アクセスし、いくつかの回答を受け入れることができるかどうかを確認してください。それは人々にもっと助けを提供するよう促します。 –

答えて

0

:ここ

がコードである

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

が範囲例外をスローして、あなたのインデックスの計算でミスを犯してきたことを語っています。換言すれば、posBからposE - 1までのインデックスはすべてbuffer内にあるわけではありません。


これは、ここでの経験豊富な人のために簡単な質問でなければなりません。

あなたは驚くでしょう。それは難しいですので:

  • あなたのコードが汚いと読みにくい、
  • あなたのコードのロジックは、醜いと不可解なハードワイヤード定数でいっぱいです
  • あなたのコードが不完全であると明らかにコンパイルエラーが含まれています、あなたがやろうとしているものの
  • あなたの説明では、それは恐ろしいであることを理解/要するに

を読み取ることは困難です。

経験豊富なプログラマーとして、私はあなたがそれを一掃し、最初から書き直すことを提案します。 (もしそれをレビューしなければならないのであれば、私はそれが "働いている"かどうかにかかわらず、明らかに維持できないものとしてそれを完全に拒絶するでしょう)

あまりにも多すぎるなら、デバッガを使うことを学ぶ必要があります。

最終的なアドバイスの1つは、Javaのバイトバッシングテキストデータが狂っていることです。それを文字ベースとして扱い、String/StringBuilderで始まり、スキャナ、フォーマッタ、および正規表現に移動することで、強力で有効なクラスライブラリを使用することができます。

+0

Stephenありがとうございます。私はそれがひどいことを知っています。私はそれが私が必要とするものをするようにしようとしています。私がStringとして扱っていない理由は、私がfts sqlite searchを持っていて、テキストhttp://www.sqlite.org/fts3.html#section_4_1内の検索エントリの位置を含むオフセット文字列を返すということです。今では、テキストを操作してアウトライン検索エントリを作成する必要があります。オフセットはバイト単位で測定されるため、ByteArrayストリームクラスを使用する必要がありましたが、文字列のテキストは2バイトと1バイトのスペースでエンコードされているため、これらのオフセットをStringクラスで使用することはできません – Ivan

0

問題ではなく、

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

の私は2番目のパラメータは常にdocに書かれているのにもかかわらず、0でなければなりませんように見える

​​

を使用している必要がありますということでした。

関連する問題