NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Если вы хотите узнать подробности, вы должны взглянуть на objects.h
(особенно комментарии в верхней части файла). Ваш ctypes.c_byte(1)
является объектом Python:
>>> import sys
>>> import ctypes
>>> isinstance(ctypes.c_byte(1), object)
True
Как отмечено @Daniel, sys.getsizeof
получает размер этого объекта Python. Этот объект Python больше, чем соответствующий объект в C. Обратите внимание на следующее из комментариев object.h
:
Objects are structures allocated on the heap. . . .
The actual memory allocated for an object
contains other data that can only be accessed after casting the pointer
to a pointer to a longer structure type. This longer type must start
with the reference count and type fields; the macro PyObject_HEAD should be
used for this.
Другими словами, макрос PyObject_HEAD
прикреплен к началу каждого объекта. Это увеличивает размер объекта Python.
ctypes.sizeof
, с другой стороны, возвращает фактический размер типа данных C
, который находится внутри объекта Python (с использованием оператора C sizeof
), .
EDIT
В свете вашей цели, которую вы упомянули в своем комментарии к сообщению Даниэля, можно отправить один байт через сервер в Python 3.x. Ниже приведен пример того, как вы должны отправить байт, используя модуль socket
Python, чтобы доказать эту точку.
Вот сервер, который вы будете запускать в одном интерпретаторе Python:
# Server
import socket
HOST = '' # All available interfaces
PORT = 50007 # Same port as client
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = conn.recv(1) # receive data with bufsize 1; a larger bufsize will break this code
if not data: break
conn.sendall(data)
conn.close()
Вот клиент, который вы будете запускать в другом интерпретаторе python:
# Client
import socket
HOST = '127.0.0.1' # The remote host, but here using localhost
PORT = 50007 # The port used by both the client and server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'1') # a bytes object
data = s.recv(1) # Receive data from the socket with bufsize of 1
s.close()
print('Received', repr(data)) # confirm receipt
sys.getsizeof
возвращает размер объекта python, это не имеет никакого отношения к размеру типа данных C. И вам ничего не нужно беспокоиться.
Модуль ctypes используется для создания и управления типами данных C в Python. Вот почему ctypes.sizeof (ctypes.c_byte (1)) возвращает 1.
>>> import sys
>>> help(sys.getsizeof) Help on built-in function getsizeof in module sys:
getsizeof(...)
getsizeof(object, default) -> int
Return the size of object in bytes.
, а
>>> import ctypes
>>> help(ctypes.sizeof)
Help on built-in function sizeof in module _ctypes:
sizeof(...)
sizeof(C type) -> integer
sizeof(C instance) -> integer
Return the size in bytes of a C instance
>>>