在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:接口未实现。
答案 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执行了运行时检查。