繁体   English   中英

Java NIO Selector.open()IOException

[英]Java NIO Selector.open() IOException

在使用java.nio.channels.Selector对象时,我不禁注意到工厂创建方法Selector.open()抛出IOException。

除了要处理另一个IOException之外,我不知道如何打开选择器可能是一个I / O操作,更不用说以某种方式使其失败并抛出IOException了。

要打开的Selector类中的代码如下:

public static Selector open() throws IOException {
    return SelectorProvider.provider().openSelector();
}

注意到它遵循了SelectorProvider对象,我去看了openSelector()的代码。 如下:

public abstract AbstractSelector openSelector()
    throws IOException;

看起来该类是在运行时动态加载的,这使这些选择器的构造方式更加神秘。

如果“动态加载”失败,则负责创建Selector的类是sun.nio.ch.DefaultSelectorProvider ,我没有其源代码,因此就跟踪IOException的源而言,我可以这样做。

Java关于选择器的javadoc根本没有帮助,它们只是指出:

抛出:IOException-如果发生I / O错误

如果有人对Selector.open()创建的市集IOException有任何见解,请告诉我。 另外,应“适当地”处理IOException(例如,消息框,闪烁的灯光,工具包的提示音等)还是将其塞入日志/空白catch块中,从而回答一个更实际的问题。

简短的答案是它是特定于平台和实现的,因此您几乎别无选择。 您应该抓住它并加以处理。 而且由于这将是一个非常罕见的事件(在此之后您将没有Selector ),所以这可能是一阵风吹草动。 选项B忽略它,让它到达栈顶并停止运行。

长的答案是,在Linux上,使用当前的默认实现,它不会被抛出。 如果它是> = 2.6内核,则openSelector()将实例化并返回EPollSelectorImpl 如果它小于2.6,则会得到PollSelectorImpl 这些类的构造函数均未抛出IOException

但是,在Windows上,您将获得WindowsSelectorImpl其构造函数的确会抛出IOException 我必须更深入地研究以找出会导致它的原因,但显然可以。

同样,它是一个实现细节,因此将来可能会随时更改。

您可以获取openjdk的完整源代码,以查看这些类的源代码。

它允许实现出于API级别自然未指定的原因而引发IOException。 例如, Selector的Windows实现使用选择树,其内部节点是管道,以处理可选通道数超过Windows最大值的情况。 因此,选择器必须能够打开管道,这可能会失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM