为什么Socket在运行时不是可闭合的实例?

时间:2015-04-23 13:43:19

标签: java android

在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 [] <类型的数组中/ em>的)。

我错过了什么吗? 知道该怎么办吗?

修改 同样,当DatagramSocket用作MyClass<DatagramSocket>的{​​{1}}时,会导致 java.lang.IncompatibleClassChangeError:接口未实现

3 个答案:

答案 0 :(得分:4)

此问题发生在19之前的Android API级别上。在受影响的版本上,Socket未实现Closeable。

来源:

答案 1 :(得分:3)

Socket本身不可关闭,但它的两个流都是。关闭任一流将关闭Socket

答案 2 :(得分:0)

对于未来的读者,我想澄清一下在本次讨论中被大家认为是显而易见的事情:

如果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执行了运行时检查。