Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Если Вы перечитываете документацию для IPC:: Open3, Вы будете видеть примечание, которое необходимо назвать waitpid для жатвы дочернего процесса. Как только Вы делаете это, состояние должно быть доступным в $?
. Значение выхода $? >> 8
. См. $?
в perldoc perlvar.
( Обновление : Я обновил API для IO:: CaptureOutput для создания этого еще легче.)
существует несколько способов сделать это. Вот одна опция, с помощью IO:: модуль CaptureOutput :
use IO::CaptureOutput qw/capture_exec/;
my ($stdout, $stderr, $success, $exit_code) = capture_exec( @cmd );
Это - capture_exec () функция, но IO:: CaptureOutput также имеет более общее получение () функция, которая может использоваться для получения или вывода Perl или вывода из внешних программ. Таким образом, если некоторый модуль Perl, оказывается, использует некоторую внешнюю программу, Вы все еще получаете вывод.
Это также означает, что только необходимо помнить один единственный подход к получению STDOUT и STDERR (или слияние их) вместо того, чтобы использовать IPC:: Open3 для внешних программ и другие модули для получения Perl производятся.
Если Вы не хотите содержание STDERR, то получение () управляет от IPC:: Система:: Простой модуль почти точно, что Вы после:
use IPC::System::Simple qw(capture system $EXITVAL);
my $output = capture($cmd, @args);
my $exit_value = $EXITVAL;
можно использовать получение () с отдельным аргументом для вызова оболочки или нескольких аргументов для надежного предотвращения оболочки. Существует также capturex (), который никогда не называет оболочку, даже с отдельным аргументом.
В отличие от встроенной системы Perl и команд обратных галочек, IPC:: Система:: Простые возвраты полное 32-разрядное значение выхода в соответствии с Windows. Это также выдает подробное исключение, если команда не может быть запущена, умирает к сигналу или возвращает неожиданное значение выхода. Это означает для многих программ, вместо того, чтобы проверить значения выхода самостоятельно, можно положиться на IPC:: Система:: Простой сделать тяжелую работу для Вас:
use IPC::System::Simple qw(system capture $EXIT_ANY);
system( [0,1], "frobincate", @files); # Must return exitval 0 or 1
my @lines = capture($EXIT_ANY, "baznicate", @files); # Any exitval is OK.
foreach my $record (@lines) {
system( [0, 32], "barnicate", $record); # Must return exitval 0 or 32
}
IPC:: Система:: Простой чистый Perl, не имеет никаких зависимостей и работает и над Unix и над системами Windows. К сожалению, это не дает возможность получения STDERR, таким образом, это не может подойти для всех Ваших потребностей.
IPC:: Run3 обеспечивает чистый и легкий интерфейс в переинфраструктуру всех трех общих дескрипторов файлов, но к сожалению это не проверяет, чтобы видеть, была ли команда успешна, таким образом, необходимо будет осмотреть $? вручную, который нисколько не забавен. Обеспечение открытого интерфейса для осмотра $? что-то, что находится на моем список ожидающих выполнения задач для IPC:: Система:: Простой, начиная с осмотра $? межплатформенным способом не задача, которой я пожелал бы на любом.
существуют другие модули в IPC:: пространство имен, которое может также предоставить Вам помощь. YMMV.
Всего самого лучшего,
Paul
Существует три основных способа выполнить внешние команды:
system $cmd; # using system()
$output = `$cmd`; # using backticks (``)
open (PIPE, "cmd |"); # using open()
С system()
, и STDOUT
и STDERR пойдет то же место как сценарий STDOUT
и STDERR,
, если эти system()
команда не перенаправляет их. Обратные галочки и open()
только для чтения STDOUT
из Вашей команды.
Вы могли также назвать что-то как следующее с открытым для перенаправления и STDOUT
и STDERR
.
open(PIPE, "cmd 2>&1 |");
код возврата всегда хранится в [1 111], как отмечено [1 112] @Michael Вагоновожатый .
Если Вы становитесь действительно сложными, Вы могли бы хотеть попробовать Expect.pm. Но это - вероятно, излишество, если Вы не должны также управлять входом отправки к процессу также.