Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
И я ответил на свой собственный вопрос! Это - команда "отладки" в pydb:
~> cat -n /tmp/test_python.py
1 #!/usr/local/bin/python
2
3 def foo():
4 print "hi"
5 print "bye"
6
7 exit(0)
8
~> pydb /tmp/test_python.py
(/tmp/test_python.py:7): <module>
7 exit(0)
(Pydb) debug foo()
ENTERING RECURSIVE DEBUGGER
------------------------Call level 11
(/tmp/test_python.py:3): foo
3 def foo():
((Pydb)) s
(/tmp/test_python.py:4): foo
4 print "hi"
((Pydb)) s
hi
(/tmp/test_python.py:5): foo
5 print "bye"
((Pydb)) s
bye
------------------------Return from level 11 (<type 'NoneType'>)
----------------------Return from level 10 (<type 'NoneType'>)
LEAVING RECURSIVE DEBUGGER
(/tmp/test_python.py:7): <module>
Можно в интерактивном режиме отладить функцию с pdb также, предоставил сценарий, который Вы хотите отладить, не выходит () в конце:
$ cat test.py
#!/usr/bin/python
def foo(f, g):
h = f+g
print h
return 2*f
Для отладки запустите интерактивную сессию Python и импортируйте pdb:
$ python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb
>>> import test
>>> pdb.runcall(test.foo, 1, 2)
> /Users/simon/Desktop/test.py(4)foo()
-> h = f+g
(Pdb) n
> /Users/simon/Desktop/test.py(5)foo()
-> print h
(Pdb)
pdb модуль идет с Python и документируется в документы модулей в http://docs.python.org/modindex.html
Существует отладчик Python, который является частью базового распределения Python, названного 'pdb'. Я редко использую его сам, но нахожу его полезным иногда.
, Учитывая эту программу:
def foo():
a = 0
print "hi"
a += 1
print "bye"
foo()
Вот сессия, отлаживая его:
$ python /usr/lib/python2.5/pdb.py /var/tmp/pdbtest.py ~
> /var/tmp/pdbtest.py(2)<module>()
-> def foo():
(Pdb) s
> /var/tmp/pdbtest.py(10)<module>()
-> foo()
(Pdb) s
--Call--
> /var/tmp/pdbtest.py(2)foo()
-> def foo():
(Pdb) s
> /var/tmp/pdbtest.py(3)foo()
-> a = 0
(Pdb) s
> /var/tmp/pdbtest.py(4)foo()
-> print "hi"
(Pdb) print a
0
(Pdb) s
hi
> /var/tmp/pdbtest.py(6)foo()
-> a += 1
(Pdb) s
> /var/tmp/pdbtest.py(8)foo()
-> print "bye"
(Pdb) print a
1
(Pdb) s
bye
--Return--
> /var/tmp/pdbtest.py(8)foo()->None
-> print "bye"
(Pdb) s
--Return--
> /var/tmp/pdbtest.py(10)<module>()->None
-> foo()
(Pdb) s
Если Вы более знакомы с отладчиком GUI, существует winpdb ('победа' в этом случае не обращается к Windows). Я на самом деле использую его на Linux.
На debian/ubuntu:
sudo aptitude install winpdb
Тогда просто помещает это в Ваш код, где Вы хотите, чтобы он повредился:
import rpdb2; rpdb2.start_embedded_debugger_interactive_password()
Тогда запускают winpdb и присоединение к Вашему под управлением сценарию.
Для интерактивной работы над кодом я разрабатываю, я обычно нахожу более эффективным установить программируемую "точку останова" в самом коде с pdb.set_trace
. Это делает его easir для повреждения на состоянии программы глубоко в цикл, также: if <state>: pdb.set_trace()