Подключение libreoffice-base к jdbc MYSQL не удалось [дублировать]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

153
задан Eric Leschinski 23 October 2014 в 14:32
поделиться

25 ответов

Итак, у вас есть

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой связи. java.net.ConnectException: соединение отклонено

Я цитирую из этот ответ , который также содержит пошаговое руководство по MySQL + JDBC:

Если вы получаете SQLException: Connection refused или Connection timed out или специфический для MySQL CommunicationsException: Communications link failure, то это означает, что БД недоступно. Это может иметь одну или несколько из следующих причин:

  1. IP-адрес или имя хоста в URL-адресе JDBC неверен.
  2. Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
  3. Номер порта отсутствует или неверен в URL-адресе JDBC.
  4. Сервер базы данных недоступен.
  5. Сервер БД не принимает соединения TCP / IP.
  6. У сервера БД закончились соединения.
  7. Что-то между Java и БД блокирует соединения, например брандмауэр или прокси.

Чтобы решить ту или иную, выполните следующие советы:

  1. Проверьте и проверьте их с помощью ping.
  2. Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
  3. Проверьте его на основе my.cnf базы данных MySQL.
  4. Запустите БД.
  5. Убедитесь, что mysqld запускается без --skip-networking option.
  6. Перезапустите БД и исправьте свой код соответственно, чтобы он закрывал соединения в finally.
  7. Отключить брандмауэр и / или настроить брандмауэр / прокси, чтобы разрешить / переместите порт.

См. также:

192
ответ дан Community 19 August 2018 в 19:30
поделиться
  • 1
    MAMP / MAMP Pro устанавливает MAMP_skip-networking_MAMP по умолчанию. Вы должны отключить эту строку в my.cfn – Jurik 25 September 2013 в 14:46
  • 2
    Не в этом случае, но ошибка связи также происходит, когда вы используете пул соединений, и соединения закрываются из-за длительного бездействия. Только в этом случае говорится, что «Последний пакет получил некоторое« X », секунды назад & quot; – nikel 19 December 2015 в 10:24
  • 3
    @nikel Не следует, чтобы потоки в пуле соединений сохранялись активными, активируя «выбрать 1». запрос проверки? Почему они могут закрыться из-за длительного бездействия, когда мы установили evictor на более короткие промежутки времени, чем таймаут сервера mysql? – Farhad 2 September 2016 в 08:34
  • 4
    Да, запрос проверки будет исправлять это. Моя точка зрения касалась случая, когда он не установлен & amp; соединения в пуле истекают из-за неактивности – nikel 2 September 2016 в 08:56
  • 5
    Отключение брандмауэра Windows работало для меня. – Hammad Tariq 19 April 2017 в 10:55

То, что для меня решило, делает 2 вещи: 1. Создайте нового пользователя, кроме root, с помощью некоторого пароля, используя следующие команды:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. комментарий IP-адрес на mysqld.conf

, затем подключиться с новым именем пользователя и паролем. он должен работать.

0
ответ дан Abdul Khalid 19 August 2018 в 19:30
поделиться

Если есть какие-либо читатели, которые столкнулись с этой проблемой для доступа к удаленному серверу: убедитесь, что порт открыт

-1
ответ дан aclokay 19 August 2018 в 19:30
поделиться

я решил эту проблему простым способом, который сработал для меня. У меня проблема с семей "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи". В моем файле db.properties у меня было это: url: jdbc: mysql: // localhost: 90 / myDB, удалили только URL-адрес порта, в результате чего появился url: jdbc: mysql: // localhost / myDB, и это сработало для меня .

2
ответ дан Dario Castro 19 August 2018 в 19:30
поделиться

Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала я поймаю «Сбой связи» и следующий «OutOfMemoryError».

Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю данные 1/2) и все в порядке.

7
ответ дан dreamcrash 19 August 2018 в 19:30
поделиться

Если вы изменили свой порт, вы получите такую ​​ошибку «com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи с каналом связи» Пожалуйста, проверьте номер вашего порта

2
ответ дан Erick G. Hagstrom 19 August 2018 в 19:30
поделиться

Это исключение com.mysql.jdbc.exceptions.jdbc4.CommunicationsException возникает, если соединение с базой данных простаивает в течение длительного времени.

Это незанятое соединение возвращает true на connection.isClosed();, но если мы попытаемся выполнить инструкцию, тогда оно запустит это исключение, поэтому я предлагаю пойти с пулом базы данных.

4
ответ дан Félix Gagnon-Grenier 19 August 2018 в 19:30
поделиться
  • 1
    Это также происходит по другим причинам, таким как «соединение отказано». – user207421 9 May 2018 в 22:09

Я столкнулся с той же проблемой в IntelliJ IDEA.

Чтобы решить проблему подключения, мне пришлось отключить (⌘ + F2 с использованием ключевых привязок по умолчанию на маке) и снова подключиться. Просто нажать «Обновить» было недостаточно.

-3
ответ дан furins 19 August 2018 в 19:30
поделиться

Попробуйте изменить localhost на 127.0.0.1.

Локальный хост будет разрешен ::1. И MySQL не может быть подключен через IPv6 по умолчанию.

И вот вывод telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

И ответа от сервера MySQL нет.

Конечно, убедитесь, что ваш сервер MySQL запущен.

0
ответ дан Haozhe Xie 19 August 2018 в 19:30
поделиться

У меня была та же проблема, и вот как она была исправлена:

  1. My .jsp вызывал атрибуты, которые я еще не определил в сервлете.
  2. I имел два имени столбца, которые я передавал в объект через ResultSet (getString("columnName")), который не соответствовал именам столбцов в моей базе данных.

Я не совсем уверен, какой из них исправил проблему, но это сработало. Кроме того, убедитесь, что вы создали новые Statement и ResultSet для каждого запроса таблицы.

0
ответ дан Incognito 19 August 2018 в 19:30
поделиться
  • 1
    (1), конечно, не вызывает этой проблемы. – user207421 9 May 2018 в 22:11

Я мог бы лаять неправильное дерево здесь, но ваше исключение, похоже, указывает на то, что ваш сервер MySQL недоступен.

Исключение в потоке «main» com.mysql.jdbc.exceptions .jdbc4.CommunicationsException: сбой связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. at ...

Что произойдет, если вы попытаетесь (из терминала)

mysql -u username -p

Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключился ли клиент mysql?

Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете запустить его при запуске.

5
ответ дан Karl Walsh 19 August 2018 в 19:30
поделиться
  • 1
    Я использую MAMP для запуска моего сервера MySQL. Это будет проблемой? – Josh K 6 June 2010 в 18:02
  • 2
    Когда я подключаюсь (через Sequel Pro) к своему localhost, я использую правильное имя пользователя / пароль, и он работает нормально. – Josh K 6 June 2010 в 18:03

Он пытался подключиться к более старой версии MySQL («версия», «5.1.73»); когда вы используете новую версию драйвера, вы получаете сообщение об ошибке «com.mysql.cj.jdbc.Driver», даже если вам не нужно указывать, какой из них вы используете:

Загрузка класса com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver '. Драйвер автоматически регистрируется через SPI, и ручная загрузка класса драйвера вообще не нужна.

Я изменил объявление использовать версию mysql-connector-java версии 5.1.38, а в коде я сохранил файл com.mysql.jdbc.Driver.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

Все началось, когда я увидел Ankit Jain's ответ

0
ответ дан manatico 19 August 2018 в 19:30
поделиться

Только что испытал это.

Чтобы заставить его работать с помощью: (это можно поместить в статическом блочном intializer)

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

Также, получив соединение через:

conn = DriverManager.getConnection(DBURL,<username>,<password>);

вместо указания параметров входа

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

С уважением.

2
ответ дан mel3kings 19 August 2018 в 19:30
поделиться
  • 1
    Статический блок не был необходим с 2007 года, и вы можете указать параметры входа в любом виде. – user207421 20 January 2017 в 22:07

Это случилось со мной, когда я изменил порт mysql от 3306 до 3307 в файлах my.ini и php.ini, но после изменения портов (3307-> 3306) он снова работал отлично.

2
ответ дан MrPencil 19 August 2018 в 19:30
поделиться

У меня такая же проблема часами. Я использую MAMP Server

Вместо использования localhost: [Apache Port] используйте ваш порт MySQL.

Ниже приведен порт MySQL по умолчанию для сервера MAMP.

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5
ответ дан Nathan Tuggy 19 August 2018 в 19:30
поделиться
  • 1
    если у вас есть маска перед установкой Mysql, попробуйте этот метод – DAVIS BENNY 15MIS0426 20 July 2018 в 12:35

У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.

После запуска сервера mysql все пошло правильно.

3
ответ дан rs2012 19 August 2018 в 19:30
поделиться

В моем случае, оказалось, что версия mysql-connector-java была высокой.

В моей демонстрации я как-то использую mysql-connector-java следующим образом:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

Но в среде разработки я использую это:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

И моя версия MySQL была 5.1.48 (да, она устарела, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.

Поскольку причина найдена, решение также найдено. Сопоставьте версию!

2
ответ дан shellbye 19 August 2018 в 19:30
поделиться
  • 1
    Вряд ли. Все эти версии драйверов должны быть обратно совместимы. – user207421 20 January 2017 в 22:10

Возможно, вы не запустили свой Mysql и Apache Server. После того, как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.

Удачи!

0
ответ дан shivam gupta 19 August 2018 в 19:30
поделиться

Мой брандмауэр блокировал сообщение 3307, которое прослушивает мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.

0
ответ дан sipekmichal.cz 19 August 2018 в 19:30
поделиться

Загрузите MySQL-JDBC-Type-4-Treiber (ig 'mysql-connector-java-5.1.11-bin.jar' из 'mysql-connector-java-5.1.11.zip') в Mysql .

В процессе компиляции и выполнения в вашем пути к классам необходимо задействовать кувшин драйвера.

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
3
ответ дан stacker 19 August 2018 в 19:30
поделиться
  • 1
    Нет, дает мне шторм ошибок о том, что я ничего не нашел. Можно ли импортировать это без JAR-файла? – Josh K 6 June 2010 в 07:56
  • 2
    @Josh это работает, вам просто нужно правильно настроить свой путь к классу. (Или скопируйте банку в свой каталог% JAVA_HOME% \ jre \ lib \ ext, но это считается плохой практикой) – stacker 6 June 2010 в 08:15

Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.

Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.

То же соединение получало успех, когда я был в любой другой сети.

3
ответ дан user207421 19 August 2018 в 19:30
поделиться

Это может быть простая проблема с jar. Возможно, вы используете старый mysql-connector-java-XXX-bin.jar, который не поддерживается вашей текущей версией mysql. Я использовал mysql-connector-java-5.1.18-bin.jar, поскольку использую mysql 5.5, и эта проблема решена для меня.

4
ответ дан xrcwrn 19 August 2018 в 19:30
поделиться
  • 1
    Да, может быть вероятность несоответствия банок. – Kiran Nunna 17 May 2015 в 14:43
  • 2
    Все эти версии драйверов должны быть совместимы. – user207421 20 January 2017 в 22:12
  • 3
    В последнем обновлении 4/5/18: В настоящее время я использую MySQL Workbench 6.3. Я пришел сюда, чтобы проверить решение, но я нашел его сам по себе, это просто, что ваш сервер MySQL не работает или он остановлен. Я перезапустил свой сервер, он работал как шарм. – Abhishek Ekaanth 5 April 2018 в 16:00
  • 4
    Это «лучшее решение», почему? Какую проблему он решает и как? – user207421 9 May 2018 в 22:09
0
ответ дан m Piroli 31 October 2018 в 05:42
поделиться
3
ответ дан user207421 31 October 2018 в 05:42
поделиться
4
ответ дан xrcwrn 31 October 2018 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: