В 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 освободит память, используемую этим объектом, и выделит другую.
Можно решить, что соединение потеряно путем создания , привел запросы XHR к сбою .
стандартный подход к , повторяют запрос несколько раз. Если это не проходит, предупреждают пользователя для проверки соединения, и сбой корректно .
Заметка на полях: Для помещения целого приложения в "офлайновое" состояние может привести к большой подверженной ошибкам работе обработки состояния.. беспроводные соединения могут прийти и уйти, и т.д. Таким образом, Ваш лучший выбор может быть, чтобы просто перестать работать корректно, сохранить данные и предупредить пользователя.. разрешение им в конечном счете зафиксировать проблему соединения, если существует один, и продолжать использовать приложение с изрядным количеством прощения.
Заметка на полях: Вы могли проверить надежный сайт как Google для возможности соединения, но это не может быть совершенно полезно как просто пытающийся выполнить Ваш собственный запрос, потому что, в то время как Google может быть доступным, Ваше собственное приложение не может быть, и Вы все еще оказываетесь перед необходимостью обрабатывать свою собственную проблему соединения. Попытка отправить ping Google была бы хорошим способом подтвердить, что само интернет-соединение снижается, поэтому если та информация полезна для Вас, то это могло бы стоить проблемы.
Заметка на полях : Отправка Ping могла быть достигнута таким же образом, что Вы сделаете любой вид двухстороннего запроса ajax, но отправка ping к Google, в этом случае, поставила бы некоторые проблемы. Во-первых, у нас были бы те же междоменные проблемы, с которыми обычно встречаются в создании связи Ajax. Одна опция состоит в том, чтобы настроить прокси серверной стороны, где мы на самом деле ping
Google (или безотносительно сайта), и возвращаем результаты ping к приложению. Это уловка - 22 , потому что, если интернет-соединение является на самом деле проблемой, мы не будем в состоянии добраться до сервера, и если проблема соединения будет только на нашем собственном домене, мы не будем в состоянии сказать различие. Другие междоменные методы можно было попробовать, например, встроив iframe на Вашей странице, которая указывает на google.com, и затем опрос iframe для успеха/отказа (исследуйте содержание, и т.д.). Встраивание изображения ничего не может действительно сказать нам, потому что нам нужен полезный ответ от механизма связи, чтобы сделать хороший вывод о том, что продолжается. Таким образом, снова определение состояния интернет-соединения в целом может быть большей проблемой, чем это стоит. Необходимо будет взвесить эти опции для определенного приложения.
API Кэша приложения HTML5 определяет navigator.onLine, который в настоящее время доступен в бетах IE8, WebKit (например, Safari) nightlies, и уже поддерживается в Firefox 3
Существует много способов сделать это:
Вы могли поместить onerror
в img
, как
<img src='http://www.example.com/singlepixel.gif'
onerror='alert("Connection dead");' />
, Этот метод мог также перестать работать, если бы исходное изображение перемещено / переименованный и обычно было бы нижним выбором к ajax опции.
, Таким образом, существует несколько различных способов попытаться обнаружить это, ни одно идеальное, но в отсутствие способности выпрыгнуть из песочницы браузера и получить доступ к состоянию сетевого соединения пользователя непосредственно, они, кажется, наилучшие варианты.
IE 8 будет поддерживать свойство window.navigator.onLine .
, Но конечно который не помогает с другими браузерами или операционными системами. Я предсказываю, что другие поставщики браузера решат обеспечить то свойство также, учитывая важность знания состояния онлайн/в режиме офлайн в приложениях Ajax.
, Пока этого не происходит, или XHR или Image()
или <img>
, запрос может обеспечить что-то близко к функциональности, которую Вы хотите.
Обновление (2014/11/16)
Главные браузеры теперь поддерживают это свойство, но Ваши результаты будут варьироваться.
Кавычка от Документация Mozilla :
В Chrome и Safari, если браузер не в состоянии соединиться с локальной сетью (LAN) или маршрутизатором, это в режиме офлайн; весь другой возврат условий
true
. Таким образом, в то время как можно предположить, что браузер в режиме офлайн, когда он возвращаетсяfalse
значение, Вы не можете предположить, что истинное значение обязательно означает, что браузер может получить доступ к Интернету. Вы могли получать ложные положительные стороны, такой как в случаях, куда компьютер запускает программное обеспечение виртуализации, которое имеет виртуальные адаптеры Ethernet, которые всегда "подключаются". Поэтому, если Вы действительно хотите определить онлайн-статус браузера, необходимо разработать дополнительные средства для проверки.В Firefox и Internet Explorer, переключая браузер на режим офлайн отправляет
false
значение. Все другие условия возвращаютсяtrue
значение.
window.navigator.onLine
то, что Вы поиск, но немного вещей здесь для добавления, во-первых, если это - что-то на приложении, которое Вы хотите продолжать проверять (любят видеть, идет ли пользователь внезапно офлайн, которые исправляют в этом случае большую часть времени, тогда необходимо послушать изменение также), для этого Вы добавляете слушателя события окна для обнаружения любого изменения для проверки, если пользователь идет офлайн, можно сделать:
window.addEventListener("offline",
()=> console.log("No Internet")
);
и для проверки, если онлайн:
window.addEventListener("online",
()=> console.log("Connected Internet")
);
Вы можете использовать обратный вызов $. Ajax () error
, который срабатывает, если запрос не выполняется. Если textStatus
равно строке «тайм-аут», это, вероятно, означает, что соединение разорвано:
function (XMLHttpRequest, textStatus, errorThrown) {
// typically only one of textStatus or errorThrown
// will have info
this; // the options for this ajax request
}
Из документа :
Ошибка : функция, которая будет вызываться, если запрос терпит неудачу. В функцию передается три аргументы: объект XMLHttpRequest, строка, описывающая тип ошибки что произошло и необязательный объект исключения, если таковое произошло. Возможные значения для второго аргумент (помимо null) - это "тайм-аут", "ошибка", "без изменений" и "parsererror". Это событие Ajax
Так, например:
$.ajax({
type: "GET",
url: "keepalive.php",
success: function(msg){
alert("Connection active!")
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
if(textStatus == 'timeout') {
alert('Connection seems dead!');
}
}
});
Как сказал Оллией, использование свойства браузера navigator.onLine
предпочтительнее, чем отправка сетевых запросов, и, соответственно, с developer.mozilla.org/En/Online_and_offline_events , он даже поддерживается старыми версиями Firefox и IE.
Недавно WHATWG указала добавление событий онлайн
и offline
, на случай, если вам потребуется отреагировать на navigator.onLine
изменяется.
Вот фрагмент имеющейся у меня вспомогательной утилиты. Это javascript с пространством имен:
network: function() {
var state = navigator.onLine ? "online" : "offline";
return state;
}
Вы должны использовать это с обнаружением метода, иначе используйте «альтернативный» способ сделать это. Быстро приближается время, когда это будет все, что нужно. Остальные методы - взломы.