• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaのエラーについて質問)

Javaのエラーについて質問

このQ&Aのポイント
  • 下記のコードでエラーが発生し、原因と改善方法を教えてください。
  • Javaのエラーについての質問です。下記のコードでUnsupportedOperationException()のエラーが発生します。原因と改善方法についてご教示願います。
  • Javaのエラーについての質問です。下記のコードでエラー、UnsupportedOperationException()が発生します。原因と改善策をお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yossy_kt
  • ベストアンサー率50% (103/203)
回答No.4

すみません、最初のコードは本来やりたいことを理解しないまま、エラー回避だけのその場しのぎで書いたものなので、申し訳ありませんが忘れて頂けると幸いです。 代わりに、元のご質問のコードでエラーが発生する理由について回答させて頂きます。 ByteBufferやIntBuffer等のBufferクラスは、文字通りデータバッファを操作するクラスです。 getメソッドやputメソッド等でバッファの内容を読み書きすることができます。 そして、このバッファの実体は配列オブジェクトに対応しています。 これは補助配列と呼ばれています。 補助配列はarrayメソッドで取得できます。 補助配列はバッファの実体に対応しているため、補助配列を通してバッファの内容を読み書きすることが可能となります。 一方、ByteBufferのasIntBufferメソッドで元のByteBufferに対応するIntBufferを生成することができますが、生成されたIntBufferは実はByteBufferへのビューに過ぎません。 つまり、元のByteBufferも生成されたIntBufferも同じバッファを参照しています。 そして、生成されたIntBufferは補助配列を持ちません。 何故なら、このバッファに対する補助配列は元のByteBufferが提供するbyte[]型の配列しか存在しないためです。 そして、arrayメソッドは補助配列が利用できない時、UnsupportedOperationExceptionの例外を発生します。 このことは、下記に説明されています。 http://docs.oracle.com/javase/jp/8/api/java/nio/ByteBuffer.html#array-- 以上が、元のコードでエラーが発生する理由になります。 ご参考になれば幸いです。

その他の回答 (3)

  • yossy_kt
  • ベストアンサー率50% (103/203)
回答No.3

申し訳ありません、元のソースコードをきちんと確認していませんでした。 確かに仰る通り、先のコードはあまり意味がありませんね。 すみませんでした。 解答例のソースコードは意味のあるコードには見えませんでしたが、例えばビッグエンディアンとリトルエンディアンにおけるデータ格納方法の違いを知りたい場合、次のようなコードで確認できると思います。 public static void main(String[] args) { ByteBuffer bigBuffer = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN); ByteBuffer litBuffer = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); int n = 0x01020304; bigBuffer.asIntBuffer().put(n); litBuffer.asIntBuffer().put(n); for (byte b : bigBuffer.array()) System.out.print(b + " "); System.out.println(""); for (byte b : litBytes.array()) System.out.print(b + " "); System.out.println(""); } このコードの実行結果から分かる通り、0x01020304(=16909060) のような値を格納すると、 ビッグエンディアン => 01 02 03 04 リトルエンディアン => 04 03 02 01 のように格納されます。 ちなみに、 int配列 {1, 2, 3, 4} は ビッグエンディアン {00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04} リトルエンディアン {01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00} となります。 ちょっとご質問の趣旨とずれてしまったかも知れませんが、ご参考になれば幸いです。

bakabon_xx
質問者

補足

yossy_kt さん 親切、明快な回答有難うございます。 貴方の回答の通り、ビッグエンディアンとリトルエンディアンでバイトの順序が 違うことを、確認しようとしましたが、練習問題の回答をベースにした改良では旨く行かないようです。 その後、コードを全く改良して、ビッグエンディアンとリトルエンディアンでバイトの順序が 逆になるコードを作成しました。 まあ、いわば間違っているかも知れない練習問題のお陰で、多少エンディアンについて理解が 深まった感じです(しかし、最初のエラーについては、未だ理解できていません)。 よって貴方に教えて頂いた『エラーの対策コード』についも、理解できていません。 もし出来れば、そのコードの説明をして頂ければ、有り難いです。 そのた: 私は、音声usbデーターの取込みを行なっていますが、libusb-win/wrapperではブロック抜けが 発生しますが、usb4javaでは、旨く行くようです。 これは、デバイスドライバーlibusb0.1とlibusb1.0の違いによるそうです。 つまり、前者はAsync伝送をサポートしておらず、後者はそれをサポートしているそうです。 その時、リトルエンディアンを使用しています。 以上

  • yossy_kt
  • ベストアンサー率50% (103/203)
回答No.2

説明が不足しているようでしたら、申し訳ありません。 下記のように変更してみてはいかがでしょうか? // ビックエンディアン ByteOrder order = ByteOrder.BIG_ENDIAN; ByteBuffer tmpBuffer = byteBuffer.order(order); // int[] ints = tmpBuffer.asIntBuffer().array(); IntBuffer iBuffer = tmpBuffer.asIntBuffer(); int[] ints = new int[iBuffer.limit()]; iBuffer.get(ints); IntBuffer intBuffer = IntBuffer.wrap(ints); System.out.println("ビックエンディアンで実行"); printChunk(random, ints, intBuffer); long end = System.currentTimeMillis(); System.out.println(""); System.out.print("経過時間:"); System.out.println((end - start) + "msec\t"); // リトルエンディアン start = System.currentTimeMillis(); order = ByteOrder.LITTLE_ENDIAN; tmpBuffer = byteBuffer.order(order); // ints = tmpBuffer.asIntBuffer().array(); iBuffer = tmpBuffer.asIntBuffer(); ints = new int[iBuffer.limit()]; iBuffer.get(ints); intBuffer = IntBuffer.wrap(ints); System.out.println("リトルエンディアンで実行"); printChunk(random, ints, intBuffer); end = System.currentTimeMillis(); System.out.println(""); System.out.print("経過時間:"); System.out.println((end - start) + "msec\t");

  • yossy_kt
  • ベストアンサー率50% (103/203)
回答No.1

asIntBuffer() は元のバッファのビューを作成するだけなので、array() をサポートしていないのだと思います。 とりあえず、下記のようにすればエラーは発生しないと思います。 IntBuffer iBuffer = byteBuffer.asIntBuffer(); ints = new int[iBuffer.limit()]; iBuffer.get(ints); 目的にあってなかったら、すみませんが。

bakabon_xx
質問者

お礼

yossy_ktさま 毎度、お世話になります。 私が勘違いしたところがあり、失礼な質問を繰り返して御免なさい。 貴方の、最初の、ご回答で旨く動作いたしました。 この上で、ビッグエンディアン、リトルエンディアンに関しまして、新規に 質問いたしますので、出来ればご回答をお願いします。 このプログラムはput(r)で入力しました乱数データーをそのまま、表示している様に 思えます。 私は、このプログラムは入力」しましたバイトデーターをエンディアン変換しまして その結果を表示すると思っていましたが、単にそのまま表示している様です。 私が期待もの: 入力(1,2,3,4,5,6,7,8,)--->(1234, 5678) これはビッグエンディアンの場合です。 以上、宜しくお願いします。

bakabon_xx
質問者

補足

毎度、お世話になります。 私の、力不足のために旨く行きません。 私の今回の、質問は下記から引用したものです。 もし出来れば、この回答のエラーを解消する方法をお教え頂けないで しょうか? TECHSCORE NewIO 2章 実習課題2 http://www.techscore.com/tech/Java/JavaSE/NIO/answer/2-2/ 以上、宜しくお願いします。

関連するQ&A

専門家に質問してみよう