Другое событие 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));
}
После возврата из fork
у вас теперь есть два процесса , выполняющие код сразу после fork
.
Итак, ваше утверждение:
, так как мы уже находимся в родительском процессе
blockquote>, является только неполным. После возврата
os.fork
родительский процесс продолжает выполнять код в качестве родительского процесса, но дочерний процесс продолжает выполнение точного кода с теми же локальными и глобальными переменными, за исключением возвращаемого значения изfork
. Итак, с точки зрения дочернего процессаnewRef
имеет значение0
, а с точки зрения родителяnewRef
имеет положительное значение. Оба процесса будут выполнять код соответственно.
Когда вы вызываете os.fork
, вы создаете новый процесс, который является точной копией существующего процесса , кроме , который в исходном процессе fork
возвращает идентификатор процесса нового (дочернего ), а в новом процессе fork
возвращает 0
. Это различие заключается в том, как вы можете сделать что-то другое в родительском и дочернем.
В вашем конкретном коде возвращаемое значение fork
в дочернем элементе 0
, поэтому дочерний процесс вызывает child
. В родительском объекте возвращаемое значение не является 0
, поэтому выполняется условие else.