![](/img/trans.png)
[英]Why InputStream and OutputStream implement Closeable and Socket doesn't?
[英]why a Socket is not instanceof Closeable at runtime?
在Android應用中,我將此代碼添加到onCreate()
Closeable sss = new Socket();
if (!(sss instanceof Closeable)) {
throw new RuntimeException("Something unexpected happened");
}
進口是:
import java.io.Closeable;
import java.net.Socket;
代碼編譯,但我得到例外:
E/AndroidRuntime( 8293): java.lang.RuntimeException: Unable to start activity...: java.lang.RuntimeException: Something unexpected happened
...
E/AndroidRuntime( 8293): Caused by: java.lang.RuntimeException: Something unexpected happened
...
在不同的上下文中,毛刺導致java.lang.ArrayStoreException
(即, java.lang.ArrayStoreException:java.net.Socket不能存儲在java.io.Closeable []類型的數組中 )。
我錯過了什么嗎? 知道該怎么辦?
編輯類似地,當DatagramSocket
用作MyClass<DatagramSocket>
for MyClass<T extends Closeable>
,它會導致java.lang.IncompatibleClassChangeError:接口未實現 。
此問題發生在19之前的Android API級別上。在受影響的版本上,Socket未實現Closeable。
資料來源:
套接字本身不可關閉,但它的兩個流都是。 關閉任一流將關閉Socket
對於未來的讀者,我想澄清一下在本次討論中被大家認為是明顯的東西:
我怎么能指定Closeable sss = new Socket();
如果Socket
不可Closeable
?
AndroidManifest.xml中指定的API要求是:
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
並且設備報告
android.os.Build.VERSION.SDK_INT=16
代碼是針對API級別19編譯的,這就是它成功編譯的原因。 但是它在API級別16上運行,這就是它失敗的原因。
換句話說,在一台計算機(台式PC)上對API19執行編譯時檢查,同時在另一台計算機(手持設備)上對API16執行運行時檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.