Хорошим местом для начала является JavaDocs . Они охватывают это:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра нулевого объекта.
- Доступ или изменение поля нулевого объекта.
- Выполнение длины null, как если бы это был массив.
- Доступ или изменение слотов с нулевым значением, как если бы это был массив.
- Бросать нуль, как если бы это было значение Throwable.
Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.
blockquote>Также, если вы попытаетесь использовать нулевую ссылку с
synchronized
, который также выдаст это исключение, за JLS :SynchronizedStatement: synchronized ( Expression ) Block
blockquote>
- В противном случае, если значение выражения равно 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 ).
Я в настоящее время использую NotePad ++. Существует ли, возможно, IDE, который заботился бы о вкладках и расположении с отступом?
Мне понравились pydev расширения затмения для этого.
Нет, нет никакого пути вокруг этого, и это дизайном:
>>> from __future__ import braces
File "<stdin>", line 1
SyntaxError: not a chance
Большинство Python программистов просто не использует вкладки, но использует пробелы для расположения с отступом вместо этого, тот путь, там не несоответствие от редактора к редактору.
Странный - Никто не упомянул GEdit (Gnome) или OpenKomodo (Windows, Mac, GNU/Linux...). Они оба являются великими!
OpenKomodo особенно имеет дело с вкладками и пробелами очень хорошо. И - это свободно. Подхлестните! Когда мне нужна более легкая штука веса, я просто использую GEdit.
Загрузите OpenKomodo здесь - http://www.openkomodo.com/
Проверьте опции своего редактора или найдите редактора/IDE, который позволяет Вам преобразовывать ВКЛАДКИ в пробелы. Я обычно устанавливал опции своего редактора заменить Символом табуляции с 4 пробелами, и я никогда не сталкиваюсь ни с какими проблемами.
Реальный ответ на Ваш вопрос - то, что, если Вы собираетесь использовать язык, необходимо изучить его синтаксис. Так же, как ошибка в делающем отступ Python может генерировать ошибку компилятора, ошибка с помощью фигурных скобок на различных других языках может также генерировать ошибку компилятора.
Еще хуже это может быть тихо неправильно истолковано компилятором, чтобы сделать неправильную вещь. Это особенно опасно, когда расположение с отступом не соответствует желаемому значению. Т.е. на многих других языках:
If(first condition)
if (second condition)
do something interesting;
else
do something different;
Приведет к неприятным неожиданностям.
Python вынуждает Вас написать код, который похож на то, что он делает. Это - хорошая вещь для других программистов, которые должны прочитать Ваш код, или для Вас, когда Вы пытаетесь прочитать свой собственный код после месяца или около этого.
В Python добавление отступа является семантическим элементом, а также обеспечением визуальной группировки для удобочитаемости.
Оба пространства и вкладка могут указать на добавление отступа. Это неудачно, потому что:
Интерпретация (интерпретации) вкладки варьируется среди редакторов и IDE и часто настраивается (и часто настраиваемый).
OTOH, некоторые редакторы не настраиваются, но применяют свои собственные правила для добавления отступа.
Различные последовательности пробелов и вкладок могут быть визуально неразличимыми.
Вырезанный и вставленный может изменить пробел.
Так, если Вы не знаете, что данная часть кода будет только изменена собой с единственным инструментом и непеременной конфигурацией, необходимо избежать вкладок для добавления отступа (настройте IDE), и удостоверьтесь, что Вас предупреждают, представлены ли они (поиск вкладок в ведущем пробеле).
И можно все еще ожидать быть укушенными время от времени, пока произвольная семантика применяется к управляющим символам.
Многие Python IDE и обычно способный текст/редакторы исходного кода могут обработать пробел для Вас.
Однако лучше просто "отпускать" и обладать пробельными правилами Python. С некоторой практикой они не войдут в Ваш путь вообще, и Вы найдете, что у них есть много достоинств, самое важное из которых:
Я немного отказывался изучить Python из-за переключения вкладок. Однако я почти не заметил его, когда я использовал Vim.
Нет. Как Python проанализировал бы Ваш сценарий, если бы был способ отключить это?
Получение Вашего добавления отступа работать правильно будет важным на любом языке, который Вы используете.
Даже при том, что это не будет влиять на осуществление программы в большинстве других языков, неправильное добавление отступа может очень сбивать с толку любого пытающегося прочитать Вашу программу, таким образом, необходимо инвестировать время в выяснение, как настроить редактора для выравнивания вещей правильно.
Python довольно либерален в том, как он позволяет Вам отступ. Можно выбрать между вкладками и пробелами (но действительно необходимо использовать пробелы), и может выбрать сколько пробелов. Единственная вещь, которой это требует, состоит в том, что Вы последовательны, который в конечном счете важен, какой язык Вы используете.
Если Вы не хотите использовать IDE/текстовый редактор с автоматическим расположением с отступом, можно использовать pindent.py сценарий, который появляется в каталог Tools\Scripts. Это - препроцессор, который может преобразовать код как:
def foobar(a, b):
if a == b:
a = a+1
elif a < b:
b = b-1
if b > a: a = a-1
end if
else:
print 'oops!'
end if
end def foobar
в:
def foobar(a, b):
if a == b:
a = a+1
elif a < b:
b = b-1
if b > a: a = a-1
# end if
else:
print 'oops!'
# end if
# end def foobar
Который является действительным Python.
Если Вы ищете рекомендацию для IDE Python после обширного исследования, я был самым довольным программным обеспечением Крыла WingIDE:
http://www.wingware.com/products
Существует ознакомительная версия, таким образом, Вам нечего терять. Это поддерживает все главные Ose и - только приблизительно 60$ для полной версии.
Мне также нравится SciTE много, который полностью свободен, свободен, свободен!
Не совсем. Существует несколько способов изменить пробельные правила для данной строки кода, но Вам все еще будут нужны уровни отступа для определения объема.
Можно завершить операторы с ;
и затем начните новый оператор на той же строке. (Который люди часто делают при игре в гольф.)
Если Вы хотите разбить одну строку в несколько строк, можно закончить строку с \
символ, что означает текущую строку эффективно, продолжается от первого непробельного символа следующей строки. Это визуально появляется, нарушают обычные пробельные правила, но законно.
Мой совет: не используйте вкладки, если у Вас есть беспорядок вкладки/пространства. Используйте пробелы и выберите или 2 или 3 пробелов в качестве Вашего уровня отступа.
Хороший редактор сделает его так, Вы не должны волноваться об этом. (режим Python для emacs, например, можно просто использовать клавишу Tab, и это сохранит Вас честными).
Вкладки и беспорядок пробелов могут быть зафиксированы путем установки редактора для использования пробелов вместо вкладок.
Для создания пробела абсолютно интуитивным можно использовать более сильный редактор кода или IDE (хотя Вам не нужен полноценный IDE, если все, в чем Вы нуждаетесь, является надлежащим автоматическим расположением с отступом кода).
Список редакторов может быть найден в Wiki Python, хотя тот является немного слишком исчерпывающим: - http://wiki.python.org/moin/PythonEditors
Уже существует вопрос в здесь, который пытается сократить это немного:
Возможно, необходимо добавить более конкретный вопрос на этом: "Какого редактора Python или IDE Вы предпочитаете в Windows - и почему?"
Я соглашаюсь с justin, и другие - выбирают хорошего редактора и используют пробелы, а не вкладки для добавления отступа, и пробельная вещь становится надуманным вопросом. Я только недавно начал использовать Python, и в то время как я думал, что пробельной проблемой будет реальное раздражение, это, оказывается, не имеет место. Для записи я использую emacs, хотя я уверен, что существуют другие редакторы там, которые делают одинаково прекрасное задание.
Если Вы - действительно тупик против него, можно всегда передавать сценарии через препроцессор, но это - плохая идея на многих уровнях. Если Вы собираетесь выучить язык, охватить функции того языка, а не попытки работать вокруг них. Иначе, какой смысл того, чтобы учить новый язык?
Возможно записать препроцессор, который берет случайным образом расположенный с отступом код с ключевыми словами псевдо-Python как "endif" и "endwhile" и правильно вещи отступов. Я должен был сделать это при использовании Python в качестве "подобного ASP" языка, потому что целое понятие "добавления отступа" становится немного нечетким в такой среде.
Конечно, даже с такой вещью действительно необходимо сделать отступ нормально, в которой точке conveter становится лишним.
Необходимо отключить символы табуляции в редакторе, когда Вы работаете с Python (всегда, на самом деле, по моему скромному мнению, но особенно когда Вы работаете с Python). Ищите опцию как "Пробелы использования для вкладок": у любого достойного редактора должен быть тот.
Я не верю так, поскольку Python является разграниченным пробелом языком. Возможно, текстовый редактор или IDE с автодобавлением отступа помогли бы. Что Вы в настоящее время используете?
Мне трудно понять, когда люди отмечают это как проблему с Python. Я сразу взял к нему, и на самом деле найдите, что это - одна из моих любимых 'функций' языка :)
На других языках у меня есть два задания: 1. Зафиксируйте фигурные скобки, таким образом, компьютер может проанализировать мой код 2. Зафиксируйте добавление отступа, таким образом, я могу проанализировать свой код.
Таким образом в Python у меня есть вдвое меньше для волнения о ;-)
(nb единственное время у меня когда-либо есть проблема с добавлением отступа, когда код Python находится в блоге и форуме, который смешивает с пробелом, но это происходит все меньше и меньше, поскольку приложения становятся более умными),
Весь пробел выходит, я имел, когда я запускал, Python были вкладки смешивания результата и пробелы. После того как я настроил все, чтобы просто использовать один или другой, я прекратил иметь проблемы.
В моем случае я настроил UltraEdit и энергию для использования пробелов вместо вкладок.
Emacs! Серьезно, его использование "вкладки является командой, не символом", абсолютно идеально подходит для разработки Python.
Нет, нет. Добавление отступа является синтаксисом для Python. Вы можете:
Нет. Добавление отступа поскольку грамматика является неотъемлемой частью языка Python, для лучше и хуже.
Да, способ есть. Я ненавижу эти ответы «ни в коем случае», нет никакого способа, пока ты не найдешь один.
И в этом случае, чего бы он ни стоил, он есть.
Я однажды читал о парне, который разработал способ программирования чтобы простой сценарий мог правильно изменить отступ в коде. Однако сегодня мне не удалось найти никаких ссылок, но, клянусь, я прочитал их.
Основные приемы - всегда использовать return
в конце функции, всегда используйте проход
в конце if
или в конце определения класса и всегда используйте continue
в конце a , а
. Конечно, для этой цели подойдет любая другая неэффективная инструкция.
Затем, простой сценарий awk может взять ваш код и определить конец блока, прочитав инструкции pass / continue / return, и начало кода с инструкциями if / def / while / ...
Of Конечно, поскольку вы разработаете свой сценарий отступа, вы увидите, что вам не нужно использовать continue после возврата внутри if, потому что возврат вызовет механизм отступа назад. То же самое и в других ситуациях. Просто используйте его.
Если вы прилежны, вы сможете вырезать / вставить и добавить / удалить if
и автоматически исправлять отступы. И, кстати, для вставки кода из Интернета вам потребуется немного его понять, чтобы вы могли адаптировать его к этой «неклассической» настройке.
Конечно, поскольку вы будете разрабатывать свой сценарий отступа, вы увидите, что вам не нужно использовать continue после возврата внутри if, потому что возврат вызовет механизм отступа назад. То же самое и в других ситуациях. Просто используйте его.
Если вы прилежны, вы сможете вырезать / вставить и добавить / удалить if
и автоматически исправлять отступы. И, кстати, для вставки кода из Интернета вам потребуется немного его понять, чтобы вы могли адаптировать его к этой «неклассической» настройке.
Конечно, поскольку вы будете разрабатывать свой сценарий отступа, вы увидите, что вам не нужно использовать continue после возврата внутри if, потому что возврат вызовет механизм отступа назад. То же самое и в других ситуациях. Просто используйте его.
Если вы прилежны, вы сможете вырезать / вставить и добавить / удалить if
и автоматически исправлять отступы. И, кстати, для вставки кода из Интернета вам потребуется немного его понять, чтобы вы могли адаптировать его к этой «неклассической» настройке.
Если вы прилежны, вы сможете вырезать / вставить и добавить / удалить if
и автоматически исправить отступы. И, кстати, для вставки кода из Интернета вам потребуется немного его понять, чтобы вы могли адаптировать его к этой «неклассической» настройке.
Если вы прилежны, вы сможете вырезать / вставить и добавить / удалить if
и автоматически исправить отступы. И, кстати, для вставки кода из Интернета вам потребуется немного его понять, чтобы вы могли адаптировать его к этой «неклассической» настройке.
Я удивлен, что никто не упомянул IDLE как хороший редактор Python по умолчанию. Приятные цвета синтаксиса, обрабатывает отступы, имеет intellisense, легко настраиваемые шрифты, и он поставляется с загрузкой Python по умолчанию. Черт возьми, я пишу в основном IronPython, но его так приятно и легко редактировать в IDLE и запускать ipy из командной строки
О, а что такого особенного в пробелах? Самый простой для чтения C или C # также имеет хороший отступ, python просто применяет очень простое правило форматирования.
Любой приличный редактор программирования сведет это раздражение к нулю. Я вижу, что в Notepad ++ есть подсветка синтаксиса, вероятно, вам просто нужно правильно настроить свои предпочтения для автоматического отступа и т. Д.