【问题标题】:I have a ConnectException that isn't being caught for some reason我有一个因某种原因没有被捕获的 ConnectException
【发布时间】:2012-07-04 01:32:28
【问题描述】:

我正在开发一个使用套接字的 Android 应用程序。我有一个名为 initializeStreams() 的函数,它打开套接字并尝试连接。如果无法建立连接,此函数将引发 ConnectException。但由于某种原因,在调用具有 ConnectException 捕获块的 initializeStreams() 的代码中,日志打印出它自己的异常堆栈跟踪,而不是转到捕获块。即使抛出了确切的异常,也永远不会到达 catch 块。代码如下:

try 块:

try {
        initializeStreams();

            /* other code */

    } catch (ConnectException e) {
        Log.i(TAG, "caught connect exception");

    }

initializeStreams():

    public void initializeStreams() throws ConnectException {
    try {
        Log.i(TAG, "Attempting to connect");

        requestSocket = new Socket(SERVER_ADDR, PORT);

                    /* other code */


    } catch (IOException e) {
        e.printStackTrace();
    }

我无法弄清楚,所以任何帮助将不胜感激。

【问题讨论】:

  • 我们无法弄清楚为什么会发生这种情况,因为您在代码中发布的唯一套接字操作不会引发 ConnectException。发布其余代码。
  • 是的。打印套接字初始化之前的日志,然后打印 ConnectException 堆栈跟踪,而不是 catch 块中的日志。 initializeStreams() 是唯一抛出 ConnectException 的函数,第一个代码 sn-p 是唯一调用它的地方。
  • 什么意思?该套接字操作是引发异常的操作,它在堆栈跟踪中这么说,并且它是目前我的程序中唯一的套接字操作。
  • 我在这里看不到任何抛出 ConnectException 的方法:docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html
  • @Th0rndike ConnectException 扩展了 SocketException。

标签: java android sockets exception connectexception


【解决方案1】:

您需要将异常链接到catch 块中。请尝试以下操作:

public void initializeStreams() throws ConnectException {
try {
    Log.i(TAG, "Attempting to connect");

    requestSocket = new Socket(SERVER_ADDR, PORT);

                /* other code */


} catch(ConnectException e){
    throw e;
}

catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

  • 奇怪,因为它甚至不能在预编辑表单中编译。 initializeStreams() 的编辑版本包含一个徒劳的捕获/抛出序列,最好完全省略。
  • @EJP 是的,你是对的。编辑后的版本确实有一个徒劳的 try/catch 块。我已经更正了我的帖子。感谢您指出该错误。
  • 第一个版本仍然无法编译:catch 的顺序错误。编辑后的版本应该catch ConnectException 而不是使用instanceof 测试,并且initializeStreams() 只需要抛出IOException,而不是Exception:后者是不好的做法。跨度>
  • 我做了一些研究,发现将instanceOf 用于exceptions 不是推荐的做法。我已经完全删除了。但是catch 块的顺序是正确的,如果try 中的代码确实抛出了ConnectExceptionIOException,它应该可以工作。
【解决方案2】:

ConnectException 扩展 SocketException 进而扩展 IOException, 所以 IOExceptioninitializeStreams() 中的捕获捕获 ConnectException. 我将完全删除 try/catch 块:返回没有多大意义无需连接即可从此方法中干净利落。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多