2014-02-27 35 views
2

首先,我知道有一個幾乎相同的問題here,但它沒有回答。所以我再問一次。DatagramChannel.receive()導致IndexOutOfBoundsException

在我的Android應用程序中,我使用非阻塞UDP套接字來做一些廣播作業,所以我選擇DatagramChannel。當我在Samsung GT-P7510(使用Android 4.0.4)上運行以下代碼時,我得到一個IndexOutOfBoundsException,它表示緩衝區不夠長。但顯然我已經分配了足夠大的空間。有誰知道原因?任何幫助表示讚賞。

代碼導致異常

ByteBuffer bytebuf = ByteBuffer.allocateDirect(1024); 
bytebuf.clear(); 

try { 
    // LINE causes the Exception! 
    SocketAddress addr = socketDiscoverChannel.receive(bytebuf); 
    if (addr != null) { 
     bytebuf.flip(); 

     InetSocketAddress remoteAddr = (InetSocketAddress) addr; 
     String remoteIP = remoteAddr.getAddress().getHostAddress(); 
     ...... 
     ...... 
} finally { 
     ...... 
} 

登錄:

02-26 16:58:22.209: E/AndroidRuntime(4695): FATAL EXCEPTION: IntentService[DaemonListeningService] 
02-26 16:58:22.209: E/AndroidRuntime(4695): java.lang.IndexOutOfBoundsException: length=36, offset=0, buffer size=0 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at java.net.DatagramPacket.setLengthOnly(DatagramPacket.java:234) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at java.net.DatagramPacket.setLength(DatagramPacket.java:222) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at libcore.io.IoBridge.postRecvfrom(IoBridge.java:528) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at libcore.io.IoBridge.recvfrom(IoBridge.java:516) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at java.nio.DatagramChannelImpl.receiveDirectImpl(DatagramChannelImpl. java:232) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at java.nio.DatagramChannelImpl.receive(DatagramChannelImpl.java:185) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at com.zisync.daemon.DaemonListeningService.startListening( DaemonListeningService.java:261) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at com.zisync.daemon.DaemonListeningService.onHandleIntent( DaemonListeningService.java:98) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService. java:65) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at android.os.Looper.loop(Looper.java:137) 
02-26 16:58:22.209: E/AndroidRuntime(4695):  at android.os.HandlerThread.run(HandlerThread.java:60) 
+0

'.flip()'是在發生異常之後,實際上它不會被執行一次......順便說一句,.flip()就是我想要的。 –

+0

看起來像Android中的一個重大錯誤對我來說。 – EJP

+0

@EJP似乎是這樣!我只是發佈一個答案,但不知道它是否正確。 –

回答

3

這是相當令人失望的問題。經過幾次嘗試,我似乎知道原因。
這是Android的一些特定版本的錯誤。
其實我沒那麼肯定,但我得到了一些支持here

我在另一個Android設備(三星GT-I9220與Android 4.1.4)上運行完全相同的代碼,它只是正常工作。

而我將ByteBuffer.allocateDirect(1024)更改爲ByteBuffer.allocate(1024)(沒有直接)後,它在導致異常的上一個設備上工作。我真的不知道原因,但這是情況。

我會離開這個問題更多的時間,以防萬一有人知道原因或確認這是否真的是Android(某些版本)的錯誤。

相關問題