簡體   English   中英

為什么Socket在運行時不是可閉合的實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM