Хотя superfell верно, что трассировка полного стека поможет диагностировать это, исходя из вашего кода, вероятная проблема заключается в том, что вы разбиваете каждый оператор на отдельные блоки try / catch. Вероятно, это не ваша основная проблема (я думаю, у вас есть проблема с сетью), но именно это приводит к сбою системы.
Как правило, в Java операторы, которые зависят друг от друга и могут генерировать исключения, помещаются в один и тот же оператор try / catch. Скорее всего, для вас происходит то, что код входит в ваш первый блок catch catch, где вы пытаетесь определить новый сокет. Это не может вызвать исключение, например «UnknownHostException». connectionSocket остается нулевым, но код входит в перехват для UnknownHostException. Вы печатаете трассировку стека, но программа не выходит. Ваш код переходит к следующему блоку try / catch, где вы звоните
PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);
Это вызывает исключение NullPointerException. Это RuntimeException, которое не проверяется, и, поскольку оно не проверено, вы не обязаны перехватывать его в операторе catch. Это исключение теперь приводит к сбою вашей виртуальной машины и к сообщению об ошибке, о котором вы сообщили.
Итак, хотя получение трассировки стека logcat расскажет нам больше о вашей проблеме, созданный вами код должен быть сведен в один оператор try / catch, поскольку весь код зависит от первого завершения try / catch, завершающегося без ошибок.
Редактировать:
Попробуйте создать приложение таким образом
public class Receive extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = new TextView(this);
Socket connectionSocket = null;
byte[] inputHolderByteArray = new byte[5*1024];
/* Connect to Server */
try {
connectionSocket = new Socket("192.168.0.104", 11313);
PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);
out.print('s');
out.flush();
connectionSocket.getInputStream().read(inputHolderByteArray);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
tv.setText("done");
setContentView(tv);
}
}
Когда мы говорим «получить трассировку стека», это означает, что вам нужно подключиться к эмулятору или устройству с помощью моста отладки Android (ADB) и программы с именем logcat. Если у вас есть только эмулятор, и к вашему компьютеру не подключен телефон, попробуйте выполнить следующее:
adb logcat *: D
Это выведет информацию журнала на терминал. Оставьте это окно открытым и запустите ваше приложение. Вы должны увидеть отпечаток стека. Пожалуйста, найдите время, чтобы познакомиться с logcat и adb.