Java 有可能在IOException后面获取errno吗?

Java 有可能在IOException后面获取errno吗?,java,java-io,Java,Java Io,我正在使用Java中的套接字,当另一端关闭套接字时,可能会出现如下异常: java.io.IOException: Broken pipe java.io.IOException: Connection reset by peer 在这种情况下,我知道连接已断开(即strerror(EPIPE)和strerror(ECONNRESET)),我应该对此采取一些措施。其他错误可能有其他含义,我可以继续使用套接字而不会出现问题 但是如果我在另一个语言环境下运行Java,错误可能会变成: java.i

我正在使用Java中的套接字,当另一端关闭套接字时,可能会出现如下异常:

java.io.IOException: Broken pipe
java.io.IOException: Connection reset by peer
在这种情况下,我知道连接已断开(即
strerror(EPIPE)
strerror(ECONNRESET)
),我应该对此采取一些措施。其他错误可能有其他含义,我可以继续使用套接字而不会出现问题

但是如果我在另一个语言环境下运行Java,错误可能会变成:

java.io.IOException: Datenübergabe unterbrochen (broken pipe)
java.io.IOException: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt

第一条消息仍然包含英文(C)消息,因此我可以在这方面进行匹配,但第二条没有。除了使用my library为所有地区提供反向
strerror
目录之外,还有什么方法可以找出此异常背后的错误号吗?

是的,这些IOExcepton中的每一个都是另一个的实例,这意味着您可以通过查看
检查的
实例,或者使用getClass()来解析错误名称。

例如,失败的绑定是
BindException

的一个实例,通常您不会从
java.io.IOException
中获得错误号


原因是Java运行的所有平台上都没有一致的错误号。

您不需要知道。您需要区分的唯一
IOException
SocketTimeoutException
。所有其他的,尤其是你提到的两个,对连接来说都是致命的,所以唯一合理的做法是关闭套接字,忘记对等方。

但是我不会在堆栈跟踪中看到
java.io.BindException:
,而不是
java.io.IOException
?你的源代码是什么?我在中没有看到任何
BindException
。这个类在SocketException下的层次结构中,@arsen好的,我错了。但是,关于
断管
对等方重置连接
这两个是原始问题中提出的错误吗?@OlivierGrégoire我仍在试图找到引发这些异常的库,或者导入名称。问一个问题,是否可以通过将默认的
区域设置
设置为英语来解决问题?然后你会在另一个变量中保存你的实际语言环境?这将迫使您传递区域设置,并在您通常不使用的任何地方使用它。将
LC_MESSAGES
设置为
C
是有效的,因此我想我会向图书馆用户推荐。不确定设置Java语言环境是否会对此处产生影响。“正常情况下”?您永远不会从
java.io.IOException
中获得
errno
值。原因是没有为它提供API。“从不”不是真的。甚至Java的标准库有时也会在
Java.io.IOException
错误消息中包含操作系统的错误号。请提供一个示例来支持您的声明。运行例如
Runtime.getRuntime().exec(“foo”)
或查看广泛使用的
NET\u ThrowByNameWithLastError
函数虽然我同意一般前提,但有一些IOException是完全可以合理区分的,例如
CharacterEncodingException
(以防您试图发现它)@OlivierGrégoire然而,这个问题是关于对等方关闭的套接字或断开的连接。@EJP正如标题和正文中所问,这个问题是关于获取
IOException
后面的错误号。我想这回答了我的问题-如果没有非致命的
IOException
s(我只读/写字节缓冲区,所以没有
CharacterEncodingException
),然后我可以平等对待它们。谢谢。@LucasWerkmeister我只能建议你重新阅读我的答案。我没有在任何地方声明“没有非致命
IOException
s”。事实上,我声明了完全相反的情况。