【问题标题】:I Really Expect an Exception Here我真的希望这里有一个例外
【发布时间】:2012-05-14 23:06:05
【问题描述】:

我正在为 Android 4.03 开发一个应用程序。相关代码是这样的:

public void startConnection() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Log.i(LOG_TAG, "Beginning");

                _socket = new Socket(_server, _port);
                _socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT);

                _writer = new BufferedWriter(new OutputStreamWriter(_socket.getOutputStream()));
                _reader = new BufferedReader(new InputStreamReader(_socket.getInputStream()));

                _in = new InputThread(_reader, new InputThreadObserver());
                _in.start();

                Log.i(LOG_TAG, "End");
            } catch (UnknownHostException e) {
                Log.i(LOG_TAG, "UnknownHostException");
            } catch (IOException e) {
                Log.i(LOG_TAG, "IOException");
            }
        }
    }).start();
}

套接字的创建在新线程中执行,否则执行会冻结几秒钟。

如果我将变量_server 设置为现有主机(例如www.google.com),一切都会顺利。但是,如果我将_server 变量设置为不存在的主机(例如asd.asd),我真的希望在记录器中打印“UnknownHostException”。这不会发生(但_socket 变量是null)。它只打印“开始”(而不是“结束”)。有什么想法吗?

编辑:

变量声明如下:

private String _server;
private Socket _socket;
private int _port;
private BufferedWriter _writer;
private BufferedReader _reader;
private InputThread _in;

编辑:

我正在尝试这个:

public void startConnection() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Log.i(LOG_TAG, "Beginning");

                _socket = new Socket(_server, _port);

                if (_socket == null)
                    Log.i(LOG_TAG, "NULL SOCKET! (test 1)");                        

            } catch (Exception e) {
                Log.i(LOG_TAG, "EXCEPTION!");
            }

            if (_socket == null)
                Log.i(LOG_TAG, "NULL SOCKET! (test 2)");
        }
    }).start();
}

不知道为什么,但输出只有:

Beginning

编辑:

等了 3 分 13 秒后,我终于得到了:

EXCEPTION!
NULL SOCKET! (test 2)

这正常吗?不应该立即抛出 UnknownHostException 吗?

【问题讨论】:

  • 由于您没有“包罗万象”的异常,即catch (Exception e),您确定没有记录您没有发现的未处理异常吗?如果您将 logcat 过滤为仅显示 LOG_TAG 标记的消息,则阅读 logcat 时可能会丢失一些内容。
  • 刚刚添加。不,没有例外。我不知道为什么...
  • 试着把这段代码移出一个单独的线程,进入你的主执行,看看你得到了什么
  • 你是说你得到一个空套接字,但是当你设置超时时你没有得到一个空指针异常?
  • 这里没有NullPointerException :(

标签: android sockets exception


【解决方案1】:

查看API docs,如果_server 是一个字符串,那么你会得到一个UnknownHost 异常。如果它是任何其他可能性,你不会。 特别是此签名将创建异常:

Socket(String host,
          int port)
   throws UnknownHostException,
          IOException

【讨论】:

  • 感谢您的回复,但是是的,_serverString。并且不会抛出异常。
  • 那你拿到NPE了吗?我刚刚将您的代码复制并粘贴到一个测试项目中,并得到了预期的 UnknownHostException。可能是您的 Java 或 Android 版本?
  • 我正在开发一个 Android 4.0.3 API 级别 15 项目。我正在我的 HTC Desire Z Android 2.3.3 中对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多