В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Соединитесь с существующим хостом, но с портом, который заблокирован брандмауэром, который просто отбрасывает TCP пакеты SYN. Например, www.google.com:81.
Можно попытаться соединиться с одним из известных веб-сайтов по порту, который не может быть доступным снаружи - 200, например. Большинство брандмауэров работает в режиме DROP, и он моделирует тайм-аут для Вас.
У меня были проблемы в том же направлении, Вы делаете. Для тестирования поведения программного обеспечения я просто отключил сетевой кабель в подходящее время. Я должен был установить точку останова прямо, прежде чем я хотел отключить кабель.
, Если я делал его снова, я поместил переключатель (нормально замкнутая мгновенная кнопка одна) в сетевом кабеле.
, Если физическое разъединение вызывает различное поведение, Вы могли бы подключить свой компьютер к дешевому концентратору и поместить переключатель, который я упомянул выше между Вашим концентратором и основной сетью.
- РЕДАКТИРОВАНИЕ - Во многих случаях Вам будет нужно сетевое соединение, работающее, пока Вы не доберетесь до определенного момента в Вашей программе, ТОГДА Вы захотите разъединить использование одного из многих предлагаемых предложений.
Самая легкая вещь состояла бы в том, чтобы отбросить Ваше соединение с помощью CurrPorts.
Однако, чтобы к модульному тесту Ваш код обработки исключений, возможно, необходимо рассмотреть абстракцию кода сетевого соединения и записать тупик, насмешку или декоратора, который выдает исключения по требованию. Вы тогда будете в состоянии протестировать логику обработки ошибок приложения, не имея необходимость на самом деле использовать сеть.
В зависимости от того, какое программное обеспечение брандмауэра Вы установили/доступны, необходимо быть в состоянии заблокировать исходящий порт и в зависимости от того, как брандмауэр является установкой, это должно просто отбросить пакет запроса на установление соединения. Никакой запрос на установление соединения, никакое соединение, тайм-аут следует. Это, вероятно, работало бы лучше, если бы это было реализовано на уровне маршрутизатора (они имеют тенденцию отбрасывать пакеты вместо того, чтобы отправить сброс, или независимо от того, что эквивалент для ситуации), но там обязан быть пакетом программного обеспечения, который это добилось бы цели также.
Существует несколько тактики, я раньше в прошлом моделировал сетевые проблемы;
, Одна из этих идей могла бы дать Вам некоторые средства искусственной генерации сценария, в котором Вы нуждаетесь
Включите свой сетевой кабель в переключатель, который не имеет никакого другого соединения/кабелей. Это должно работать, по моему скромному мнению.
Несмотря на него не абсолютно ясно, какой OP хочет протестировать: существует различие между попыткой соединения с несуществующим хостом/портом и тайм-аутом уже установленного соединения. Я пошел бы с Rob и ожидал бы, пока соединение не работает, и затем вытяните кабель. Или - для удобства - имеют виртуальную машину, работающую тестовым сервером (с соединенными мостом сетями) и просто деактивация виртуального сетевого интерфейса, как только соединение устанавливается.
Вы могли бы установить драйвер Microsoft Loopback, который создаст отдельный интерфейс для Вас. Тогда можно соединиться на нем с некоторым вашим сервисом (собственный хост). Тогда в Сетевых соединениях можно отключить/разрешить такой интерфейс...
Подключение к немаршрутизируемому IP-адресу, например 10.255.255.1.
Как насчет программного решения:
Установите SSH-сервер на сервер приложений. Затем используйте туннель сокета для создания связи между вашим локальным портом и удаленным портом на сервере приложений. Для этого вы можете использовать инструменты клиента ssh. Вместо этого пусть ваше клиентское приложение подключается к сопоставленному локальному порту. Затем вы можете по желанию разорвать туннель сокета, чтобы имитировать тайм-аут соединения.