【发布时间】: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:(