Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.
Просто упоминать это явно, так как другие ответы не соответствуют. Для ping-части isReachable () требуется root-доступ в Unix. И как указано в 4779367 :
И если вы спросите, почему ping из bash этого не делает, на самом деле это тоже нужно. Сделайте это ls -l /bin/ping.
blockquote>Поскольку использование root не было вариантом, в моем случае решение заключалось в том, чтобы разрешить доступ к порту 7 в брандмауэре на конкретный сервер, который мне интересен в.
Метод «isReachable» во многих случаях не использовался для меня. Вы можете прокрутить страницу вниз, чтобы увидеть мою альтернативу для простого тестирования, если вы в сети и можете разрешать внешние хосты (например, google.com) ... Что обычно работает на машинах * NIX.
Проблема
Об этом много болтовни:
Часть 1: Воспроизводимый пример проблемы
Обратите внимание, что в этом случае он не работает ,
//also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd"
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress address : addresses) {
if (address.isReachable(10000))
{
System.out.println("Connected "+ address);
}
else
{
System.out.println("Failed "+address);
}
}
//output:*Failed www.google.com/74.125.227.114*
Часть 2: Hackish обходной путь
В качестве альтернативы вы можете сделать это:
// in case of Linux change the 'n' to 'c'
Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);
Опция -c ping позволит ping просто попытаться добраться до сервера один раз (в отличие от бесконечного пинга, который мы использовали для использования на терминале).
Это вернет 0, если хост достижимы. В противном случае вы получите «2» в качестве возвращаемого значения.
Гораздо проще - но, конечно, это специфичная для платформы. И может быть некоторые предостережения о привилегиях для использования этой команды, но я нахожу, что это работает на моих машинах.
ПОЖАЛУЙСТА, обратите внимание: 1) Это решение не является качеством продукции. Это немного взломать. Если google не работает, или ваш интернет временно медленный, или, может быть, даже если есть какая-то забава в ваших привилегиях / системных настройках, если бы можно было вернуть ложные негативы (т. Е. Он мог выйти из строя, даже если входной адрес достигнут). 2) Ошибка isReachable является нерешенной проблемой. Опять же - есть несколько онлайн-ресурсов, указывающих на отсутствие «идеального» способа сделать это на момент написания этой статьи, из-за того, как JVM пытается достичь хостов - я думаю, что это неотъемлемо специфичная для платформы задача, которая, хотя и простая , еще недостаточно отвлечен JVM.
private boolean isReachable(int nping, int wping, String ipping) throws Exception {
int nReceived = 0;
int nLost = 0;
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("ping -n " + nping + " -w " + wping + " " + ipping);
Scanner scanner = new Scanner(process.getInputStream());
process.waitFor();
ArrayList<String> strings = new ArrayList<>();
String data = "";
//
while (scanner.hasNextLine()) {
String string = scanner.nextLine();
data = data + string + "\n";
strings.add(string);
}
if (data.contains("IP address must be specified.")
|| (data.contains("Ping request could not find host " + ipping + ".")
|| data.contains("Please check the name and try again."))) {
throw new Exception(data);
} else if (nping > strings.size()) {
throw new Exception(data);
}
int index = 2;
for (int i = index; i < nping + index; i++) {
String string = strings.get(i);
if (string.contains("Destination host unreachable.")) {
nLost++;
} else if (string.contains("Request timed out.")) {
nLost++;
} else if (string.contains("bytes") && string.contains("time") && string.contains("TTL")) {
nReceived++;
} else {
}
}
return nReceived > 0;
}
nping - это число попыток ping ip (пакетов), если у вас занята сеть или системы, выберите более крупные номера. wping - это время ожидания понга из ip, вы можете установить его на 2000 мс для использования этого метода, и можете написать это:
blockquote>isReachable(5, 2000, "192.168.7.93");
Если вы хотите только проверить, подключен ли он к интернету, этот метод возвращает true, если интернет подключен, предпочтительнее, если вы используете адрес сайта, который вы пытаетесь подключить через программу.
public static boolean isInternetReachable()
{
try {
//make a URL to a known source
URL url = new URL("http://www.google.com");
//open a connection to that source
HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
//trying to retrieve data from the source. If there
//is no connection, this line will fail
Object objData = urlConnect.getContent();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
Я не уверен, что было в состоянии, когда исходный вопрос был задан еще в 2012 году.
Как сейчас, ping будет выполняться как корень. Через авторизацию ping исполняемого файла вы увидите флаг + s, а процесс, принадлежащий root, означает, что он будет запущен с правами root. запустите ls -liat, где находится ping, и вы увидите его.
Итак, если вы запустите InetAddress.getByName («www.google.com»). isReacheable (5000) как root, он должен return true.
вам нужны правильные авторизации для raw-сокета, который используется ICMP (протокол, используемый ping)
InetAddress.getByName так же надежен, как и ping, но вам нужно правильные разрешения на процесс, чтобы он работал правильно.
Поскольку вы можете пинговать компьютер, ваш Java-процесс должен работать с достаточными полномочиями для выполнения проверки. Возможно, из-за использования портов в нижнем диапазоне. Если вы запустите свою Java-программу с помощью sudo / superuser, я буду держать пари, что она работает.
Я бы предположил, что ТОЛЬКО надежный способ протестировать подключение к Интернету - это фактически подключиться и загрузить файл, или разобрать вывод вызова ping с помощью exec (). Вы не можете полагаться на код выхода для ping, а isReachable () - это дерьмо.
Вы не можете полагаться на код выхода ping, поскольку он возвращает 0, если команда ping выполняется правильно. К сожалению, ping выполняется правильно, если он не может дойти до целевого хоста, но получает «Destination host unreachable» от вашего домашнего ADSL-маршрутизатора. Это своего рода ответ, который обрабатывается как успешный хит, поэтому выходим из кода = 0. Имейте в виду, что это относится к системе Windows. Не проверено * nixes.
Я пришел сюда, чтобы получить ответ на этот же вопрос, но я был неудовлетворен любым из ответов, потому что искал независимое от платформы решение. Вот код, который я написал и независим от платформы, но требует информации о любом открытом порту на другом компьютере (который мы имеем большую часть времени).
private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
// Any Open port on other machine
// openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
try {
try (Socket soc = new Socket()) {
soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
}
return true;
} catch (IOException ex) {
return false;
}
}