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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
У Вас есть два варианта:
Использование fileno()
для получения дескриптора файла, связанного с stdio
, потоковый указатель
не использует <stdio.h>
вообще, тот способ, которым Вы не должны волновать по поводу сброса ни одного - все записи сразу перейдут к устройству, и для устройств посимвольного ввода-вывода эти write()
, вызов даже не возвратится, пока IO низшего уровня не завершился (в теории).
Для уровня устройств IO я сказал бы, что довольно необычно использовать stdio
. Я настоятельно рекомендовал бы использовать низшего уровня open()
, read()
и write()
функции вместо этого (на основе Вашего более позднего ответа):
int fd = open("/dev/i2c", O_RDWR);
ioctl(fd, IOCTL_COMMAND, args);
write(fd, buf, length);
fflush()
только сбросы буферизация, добавленная слоем stdio fopen()
, как управляется эти FILE *
объект. Сам базовый файл, как замечено ядром, не буферизуется на этом уровне. Это означает, что пишет, что обходят FILE *
, слой, с помощью fileno()
и сырые данные write()
, также не буферизуется способом, что fflush()
сбросил бы.
, Поскольку другие указали, попробуйте не смешивание двух. Если необходимо использовать "необработанные" функции ввода-вывода такой в качестве ioctl()
, то open()
файл сами непосредственно, без [1 113] использование fopen<()
и друзья от stdio.
Если Вы хотите пойти наоборот (свяжите ФАЙЛ* с существующим дескриптором файла), используйте fdopen ():
FDOPEN(P)
NAME
fdopen - associate a stream with a file descriptor
SYNOPSIS
#include <stdio.h>
FILE *fdopen(int fildes, const char *mode);
Похоже, что вы ищете функцию fsync () (или fdatasync ()?), Или вы можете использовать флаг O_SYNC в вызове open ().
Я думаю, что вы ищете, может быть
int fsync(int fd);
или
int fdatasync(int fd);
fsync
сбросит файл из буфера ядра на диск. fdatasync
также подойдет, за исключением метаданных.