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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Из popen руководства:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
Попробуйте popen () функция. Это выполняет команду, как система (), но направляет вывод в новый файл. Указатель на поток возвращается.
FILE *lsofFile_p = popen("lsof", "r");
if (!lsofFile_p)
{
return -1;
}
char buffer[1024];
char *line_p = fgets(buffer, sizeof(buffer), lsofFile_p);
pclose(lsofFile_p);
РЕДАКТИРОВАНИЕ: неправильно читайте вопрос как желание передать вывод другой программе, не другую функцию. popen () почти наверняка, что Вы хотите.
Система предоставляет Вам полный доступ к оболочке. Если Вы хотите продолжить использовать его, можно перенаправить, это производится во временный файл системой ("ls> tempfile.txt"), но выбор безопасного временного файла является болью. Или, можно даже перенаправить его через другую программу: система ("ls | otherprogram");
Некоторые могут рекомендовать popen () команда. Это - то, что Вы хотите, если можно обработать вывод сами:
FILE *output = popen("ls", "r");
, который даст Вам подсказку ФАЙЛА, из которой можно читать с выводом команды на нем.
можно также использовать канал (), звонят для создания соединения в сочетании с ветвлением () для создания новых процессов, dup2 () для изменения стандартного ввода и вывода их, должностное лицо (), чтобы запустить новые программы и ожидать () в основной программе для ожидания их. Это просто настраивает конвейер во многом как оболочка, был бы. Посмотрите канал () страница справочника для деталей и примера.
Функции popen()
и pclose()
могли быть тем, что Вы ищете.
Смотрят на glibc руководство для примера.
В Windows, вместо того, чтобы использовать систему (), CreateProcess использования, перенаправляют вывод к каналу и подключение к каналу.
я предполагаю, что это также возможно в некотором POSIX путь?
Я не совсем уверен, что его возможное в стандарте C, поскольку два различных процесса обычно не совместно используют пространство памяти. Самым простым путем я могу думать, чтобы сделать это, должен был бы иметь вторую программу, перенаправляют ее вывод к текстовому файлу (programname> textfile.txt) и затем читают, тот текстовый файл въезжают задним ходом для обработки. Однако это не может быть лучшим способом.