Другое событие 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));
}
Я обнаружил, что могу решить свою проблему, используя флаг: KEY_WOW64_64KEY
, например:
result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
Для полного объяснения: 32-битные и 64-битные данные приложения в Реестр
В Windows 64-разрядная система Реестр на самом деле разделен на две части. Один раздел используется 64-разрядными процессами и одной частью 32-разрядными процессами.
, Например, если 32-разрядное приложение программно пишет в то, чему оно верит, HKLM\SOFTWARE\Company\Application, оно на самом деле перенаправляется WoW64-слоем к HKLM\SOFTWARE\Wow6432Node\Company\Application.
Поэтому, когда Вы запускаете свое 32-разрядное приложение и называете RegOpenKeyEx, это на самом деле работает против папки Wow6432Node\, а не регулярного \SOFTWARE узла.
У меня была похожая проблема. Я использовал:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(LPWSTR)"SOFTWARE\\0test",
0,
WRITE_DAC ,
&hKey);
Это не сработало. Я попробовал так, и это сработало:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\0test"),
0,
WRITE_DAC ,
&hKey);