![](/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.