Хорошим местом для начала является 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 = "";
Либо метод
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 ).
Мне удалось решить эту проблему и сгенерировать файл .so в одной команде
gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7 utilsmodule.c
попробуйте apt-файл. Трудно запомнить имя пакета, в котором находится отсутствующий файл. Он является общим и полезным для любых файлов пакетов.
Например:
root@ubuntu234:~/auto# apt-file search --regexp '/Python.h$'
pypy-dev: /usr/lib/pypy/include/Python.h
python2.7-dbg: /usr/include/python2.7_d/Python.h
python2.7-dev: /usr/include/python2.7/Python.h
python3.2-dbg: /usr/include/python3.2dmu/Python.h
python3.2-dev: /usr/include/python3.2mu/Python.h
root@ubuntu234:~/auto#
Теперь вы можете сделать экспертную догадку о том, какой из них выбрать.
Эта ошибка возникла, когда я попытался установить ctds на CentOS 7 с Python3.6. Я сделал все трюки, упомянутые здесь, включая yum install python34-devel
. Проблема была Python.h
найдена в /usr/include/python3.4m but not in /usr/include/python3.6m
. Я попытался использовать --global-option
для указания на включение dir (pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds
). Это привело к тому, что при связывании ctds не удалось найти lpython3.6m
.
Наконец, что нужно было исправить, чтобы среда разработки для Python3.6 исправлялась с помощью include и libs.
yum -y install https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/python36u-libs-3.6.3-1.ius.centos7.x86_64.rpm
Python.h должен быть включен в ваш путь include для gcc. Какая бы версия python не использовалась, например, если она равна 3,6, то она должна быть в /usr/include/python3.6m/Python.h
как правило.
Я также столкнулся с этой ошибкой, когда устанавливал coolprop в ubuntu.
Для ubuntu 16.04 с python 3.6
sudo apt-get install python3.6-dev
Если это не работает, попробуйте установить / обновить gcc
lib.
sudo apt-get install gcc
Если вы используете tox для запуска тестов на нескольких версиях Python, вам может потребоваться установить библиотеки разработчиков Python для каждой версии Python, на которую вы тестируете.
sudo apt-get install python2.6-dev
sudo apt-get install python2.7-dev
etc.
python2.6-dev
, python2.7-dev
, python{version}-dev
– Philip Ramirez
28 April 2015 в 06:52
Я хотел бы добавить также решение для Cygwin :
Вам нужно установить пакет python2-devel
или python3-devel
, в зависимости от версии Python, которую вы с помощью.
Вы можете быстро установить его с помощью 32-битного или 64-битного setup.exe
(в зависимости от вашей установки) из Cygwin. com .
Пример (измените имя файла setup.exe
и основную версию Python, если вам нужно):
$ setup.exe -q --packages=python3-devel
Вы также можете проверить мои другие answer еще несколько вариантов установки пакетов Cygwin из командной строки.
Похоже, что вы неправильно установили файлы заголовков и статические библиотеки для python dev. Используйте диспетчер пакетов, чтобы установить их в системном масштабе.
Для apt
(Ubuntu, Debian ...):
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
Для yum
(CentOS, RHEL ...):
sudo yum install python-devel # for python2.x installs
sudo yum install python34-devel # for python3.4 installs
Для dnf
(Fedora ...):
sudo dnf install python2-devel # for python2.x installs
sudo dnf install python3-devel # for python3.x installs
Для zypper
(openSUSE ...):
sudo zypper in python-devel # for python2.x installs
sudo zypper in python3-devel # for python3.x installs
Для apk
( Alpine ...):
# This is a departure from the normal Alpine naming
# scheme, which uses py2- and py3- prefixes
sudo apk add python2-dev # for python2.x installs
sudo apk add python3-dev # for python3.x installs
locate Python.h
и посмотрите, есть ли у вас файл, прежде чем делать все это. Если вы найдете найденный файл, в основном этот ответ будет работать: stackoverflow.com/a/19344978/4954434 (Это может быть просто проблема с пути)
– Jithin Pavithran
25 January 2017 в 17:44
Он часто появляется, когда вы пытаетесь удалить python3.5
и установить python3.6
.
Таким образом, при использовании python3
(который python3 -V
=> python3.6
) для установки некоторых необходимых пакетов python3.5
появится эта ошибка.
Разрешить установкой модуля python3.6-dev
.
На Ubuntu я запускал Python 3, и мне пришлось установить
sudo apt-get install python3-dev
. Если вы хотите использовать версию Python, которая не связана с python3, установите связанный python3.x-dev пакет. Например:
sudo apt-get install python3.5-dev
sudo apt-get install python3.4-dev
для моего Python3.4, и это решило мою проблему.
– Aaron Lelevier
8 September 2014 в 14:40
sudo apt-get install python2.7-dev
исправлена проблема
– RockScience
30 December 2014 в 10:09
python3-dev
установит зависимости для этой версии, которые связаны с командой python3
. Итак, если вы хотите установить определенную версию, используйте полную версию, например - python3.x-dev
.
– xyres
25 December 2017 в 17:12
Если вы используете virtualenv с 3.6 python (край сейчас), обязательно установите соответствующий python 3.6 dev sudo apt-get install python3.6-dev
, в противном случае выполнение sudo python3-dev
установит python dev 3.3.3-1, t решить проблему.
Иногда даже после установки python-dev ошибка сохраняется. Проверьте наличие ошибки, если она отсутствует.
Сначала загрузите, как указано в https://stackoverflow.com/a / 21530768/8687063 , затем установите gcc
Для apt (Ubuntu, Debian ...):
sudo apt-get install gcc
Для yum (CentOS, RHEL ...) :
sudo yum install gcc
Для dnf (Fedora ...):
sudo dnf install gcc
Для zypper (openSUSE ...):
sudo zypper in gcc
Для apk (Alpine ...):
sudo apk gcc
Конечно, python-dev
или libpython-all-dev
- это первое, что нужно (apt
) install
, но если это не помогло, как и в моем случае, я советую вам установить внешний интерфейс / g0] пакетами sudo apt-get install libffi-dev
и sudo pip install cffi
.
Это должно помочь, особенно если вы видите ошибку как / из c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory
.
Это не такая же ситуация, но она также работает для меня, и теперь я могу использовать SWIG с Python3.5:
Я пытался скомпилировать:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
blockquote>С Python 2.7 работает отлично, а не с моей версией 3.5:
existe_wrap.c: 147: 21: фатальная ошибка: Python.h: нет существующей команды el archio завершена.
blockquote>После запуска в моей установке Ubuntu 16.04:
sudo apt-get install python3-dev # for python3.x installs
Теперь я могу скомпилировать без проблем Python3.5:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Если вы используете малину Pi:
sudo apt-get install python-dev
Для товарищей OpenSuse:
sudo zypper install python3-devel
Это означает, что Python.h
отсутствует в ваших путях включения по умолчанию вашего компилятора. Установили ли вы его как в системе, так и локально? Какова ваша ОС?
Вы можете использовать флаг -I<path>
, чтобы указать дополнительный каталог, в котором ваш компилятор должен искать заголовки. Вам, вероятно, придется следить за -L<path>
, чтобы gcc мог найти библиотеку, с которой вы будете связываться, используя -l<name>
.
в Fedora запускает это для Python 2:
sudo dnf install python2-devel
и для Python 3:
sudo dnf install python3-devel
apt-get install python-dev
.
– Deleet
31 August 2017 в 15:59
В моем случае, что исправлено в Ubuntu, было установить пакеты libpython-all-dev
(или libpython3-all-dev
, если вы используете Python 3).
AWS EC2 устанавливает запуск python34:
sudo yum install python34-devel
Для CentOS 7:
sudo yum install python36u-devel
Я выполнил инструкции для установки python3.6 на нескольких виртуальных машинах: https://www.digitalocean.com/community/tutorials/how- to-install-python-3-and-setup-a-local-programming-environment-on-centos-7 , а затем смог построить mod_wsgi и заставить его работать с python3.6 virtualenv
Для меня это изменилось:
#include <python2.7/Python.h>
Я нашел файл /usr/include/python2.7/Python.h
, а поскольку /usr/include
уже находится в пути включения, тогда python2.7/Python.h
должно быть достаточно.
Вместо этого вы можете добавить путь include из командной строки - gcc -I/usr/lib/python2.7
(спасибо @ erm3nda).
gcc -I/usr/lib/python2.7 etc
, а не жестко кодировать вызовы include.
– erm3nda
29 March 2017 в 02:31
Убедитесь, что файлы разработчика Python поставляются с вашей ОС.
Не следует жестко закодировать библиотеку и включить пути. Вместо этого используйте pkg-config, который выведет правильные параметры для вашей конкретной системы:
$ pkg-config --cflags --libs python2
-I/usr/include/python2.7 -lpython2.7
Вы можете добавить ее в свою строку gcc :
gcc $(pkg-config --cflags --libs python2) -Wall utilsmodule.c -o Utilc
В AWS API (centOS) его
yum install python27-devel
pip install cryptography
на экземпляре amazon linux.
– Ryan Tuck
7 March 2017 в 00:34
Две вещи, которые вам нужно сделать.
Установить пакет разработки для Python, в случае Debian / Ubuntu / Mint это делается с помощью команды:
sudo apt-get install python-dev
Во-вторых, включить файлы по умолчанию не включены в путь include, а также библиотека Python, связанная с исполняемым файлом по умолчанию. Вам нужно добавить эти флаги (замените версию Python соответственно):
-I/usr/include/python2.7 -lpython2.7
Другими словами, ваша команда компиляции должна быть:
gcc -Wall -I/usr/include/python2.7 -lpython2.7 utilsmodule.c -o Utilc
pkg-config
вместо raw -I
: stackoverflow.com/a/21531170/895245
– Ciro Santilli 新疆改造中心 六四事件 法轮功
15 August 2018 в 11:16
Если вы используете Python 3.6 на Amazon Linux (на основе RHEL, но приведенные здесь ответы RHEL не работают):
sudo yum install python36-devel