Другое событие 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));
}
Поскольку Вы имеете дело с массивом строк, Вы рассмотрели Соединение?
If Len(Join(FileNamesList)) > 0 Then
Я обобщу проблему и Вопрос, как предназначено. Тестовое присвоение на массиве, и фиксирует возможную ошибку
Function IsVarArrayEmpty(anArray as Variant)
Dim aVar as Variant
IsVarArrayEmpty=False
On error resume next
aVar=anArray(1)
If Err.number then '...still, it might not start at this index
aVar=anArray(0)
If Err.number then IsVarArrayEmpty=True ' neither 0 or 1 yields good assignment
EndIF
End Function
Уверенный, что это пропускает массивы со всеми отрицательными индексами, или все> 1... являются этим, вероятно? в weirdland, да.
Этот код не делает то, что Вы ожидаете:
If Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
при передаче пустой строки (""
) или vbNullString
к Dir
она возвратит название первого файла в пути текущего каталога (путь, возвращенный CurDir$
). Так, если SigString
будет пусто, Ваш If
, то условие оценит к True
, потому что Dir
возвратит непустую строку (название первого файла в текущем каталоге), и GetBoiler
будет назван. И если SigString
будет пусто, вызов к [1 113] перестанет работать.
необходимо или изменить условие проверить, что SigString
не пусто, или используйте FileSystemObject.FileExists
метод вместо [1 116] для проверки, если файл существует. Dir
хитро для использования точно, потому что это делает вещи, которые Вы не могли бы ожидать, что он сделает. Лично, я использовал бы Scripting.FileSystemObject
[более чем 1 119], потому что нет никакого забавного бизнеса (FileExists
возвраты True
, если файл существует, и, ну, в общем, False
, если он не делает). Кроме того, FileExists
выражает намерение из Вашего кода очень ясно, чем [1 124].
Метод 1: Проверьте, что SigString
непуст первый
If SigString <> "" And Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Метод 2: Используйте FileSystemObject.FileExists
метод
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(SigString) Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
Если Вы протестируете на функции массива, то она будет работать на все границы:
Function IsVarArrayEmpty(anArray As Variant)
Dim i As Integer
On Error Resume Next
i = UBound(anArray,1)
If Err.number = 0 Then
IsVarArrayEmpty = False
Else
IsVarArrayEmpty = True
End If
End Function