Другим случаем, когда NullReferenceExceptions
может случиться, является (неправильное) использование оператора as
:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
Здесь Book
и Car
являются несовместимыми типами; a Car
не может быть преобразован / передан в Book
. Когда этот сбой завершается неудачно, as
возвращает null
. Используя mybook
после этого, вы вызываете NullReferenceException
.
В общем случае вы должны использовать cast или as
, как показано ниже:
Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:
ComicBook cb = (ComicBook)specificBook;
Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as
:
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
Другие плакаты, вероятно, правильны ... там могут быть пробелы, смешанные с вашими вкладками. Попробуйте выполнить поиск и amp; замените все вкладки на несколько пробелов.
Попробуйте следующее:
import sys
def Factorial(n): # return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
print Factorial(10)
Строка: result = result * i
должна быть отступом (это тело цикла for).
Или - у вас есть смешанное пространство и символы табуляции
ВАЖНО: Пространства являются предпочтительным методом - см. PEP008 Отступы и вкладки или пробелы? . (Спасибо @Siha за это.)
Для пользователей Sublime Text
:
Установите Sublime Text
для использования вкладок для отступов: View
-> Indentation
- > Convert Indentation to Tabs
Снимите флажок Indent Using Spaces
, а также в том же подменю выше. Это немедленно устранит эту проблему.
для Atom Users, Packages ->whitspace -> remove trailing whitespaces
это сработало для меня
Это может быть из-за того, что функция над ней не имеет отступов одинаково. то есть
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
Чтобы легко проверить проблемы с вкладками / пробелами, вы действительно можете это сделать:
python -m tabnanny yourfile.py
или вы можете правильно настроить редактор правильно: -)
Если вы используете Vim, нажмите escape, а затем введите
gg = G
. Это автоматически отбрасывает все и очищает все пробелы, которые вы вложили.
Всякий раз, когда я сталкивался с этой ошибкой, это потому, что я каким-то образом смешал вкладки и пробелы в своем редакторе.
Это связано с тем, что происходит смешение как вкладок, так и пробелов. Вы можете либо удалить все пробелы, либо заменить их вкладками.
Или попробуйте записать это:
#!/usr/bin/python -tt
в начале кода. Эта строка разрешает любые различия между вкладками и пробелами.
Если вы используете редактор IDLE Python, вы можете сделать так, как это предлагает в одном из похожих сообщений об ошибке:
1) выбрать все, например. Ctrl + A
2) Перейдите в формат -> Untabify Region
3) Двойная проверка вашего отступов по-прежнему правильная, сохраните и запустите программу.
I используя Python 2.5.4
Если вы используете редактор Komodo, вы можете сделать то, что он предлагает в одном из похожих сообщений об ошибке:
1) выбрать все, например. Ctrl + A
2) Перейдите в раздел Код -> Отменить регион
3) Двойная проверка вашего отступов по-прежнему правильная, сохраните и запустите программу.
I используя Python 3.4.2
Если вы используете блокнот ++, выполните «замену» расширенным поисковым режимом, чтобы найти \ t и заменить на четыре пробела.
Просто добавление. У меня была аналогичная проблема с обоими отступами в Notepad ++.
В Atom
перейдите к
Packages > Whitespace > Convert Spaces to Tabs
Затем снова проверьте свой отступ файла:
python -m tabnanny yourFile.py
или
>python
>>> help("yourFile.py")
Выглядит как проблема с отступом. Вам не нужно сопоставлять фигурные скобки в Python, но вы do должны соответствовать уровням отступов.
. Лучший способ предотвратить проблемы с пространством / вкладками - показать невидимые символы в вашем Текстовый редактор. Это даст вам быстрый способ предотвратить и / или устранить ошибки, связанные с отступлением.
Кроме того, вставка кода с копированием является распространенным источником для этого типа проблем.
Вы уверены, что вы не смешиваете вкладки и пробелы в белом пространстве? (Это вызовет эту ошибку.)
Обратите внимание, что вы не используете вкладки в коде Python. См. Руководство по стилю . Вы должны настроить Notepad ++ для вставки пробелов для вкладок.
в моем случае проблема заключалась в конфигурации pydev на Eclipse
[/g0]
Если вы используете Sublime-текст для разработки python, вы можете избежать ошибки, используя пакет Anaconda.После установки Anaconda,
blockquote>
- откройте файл в sublime
- щелкните правой кнопкой мыши на открытых пространствах
- выберите anaconda
- нажмите на autoformat
- DONE или Нажмите CTRL + ALT + R.
Вчера у меня была такая же проблема, это была ошибка отступов, использовался мощный редактор текста. взял мои часы, пытаясь исправить это, и в конце концов я закончил копирование кода в текстовый редактор VI, и он просто отлично работал. ps python слишком чувствителен к пробелу, не забудьте перемещать пространство и вкладку.
, даже я тоже столкнулся с той же проблемой, позже я обнаружил, что есть проблема с кодировкой. i предлагаю вам также изменить редактор ur. лучшие дружественные к python IDE или редакторы - это pycharm, sublime, vim для linux.