Как проверить на пустой массив в vba макросе [дубликат]

Другое событие 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));
}

57
задан Guy 12 February 2016 в 16:17
поделиться

4 ответа

Поскольку Вы имеете дело с массивом строк, Вы рассмотрели Соединение?

If Len(Join(FileNamesList)) > 0 Then
74
ответ дан Fionnuala 24 November 2019 в 19:13
поделиться

Я обобщу проблему и Вопрос, как предназначено. Тестовое присвоение на массиве, и фиксирует возможную ошибку

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, да.

0
ответ дан Lance Roberts 24 November 2019 в 19:13
поделиться

Этот код не делает то, что Вы ожидаете:

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
4
ответ дан Mike Spross 24 November 2019 в 19:13
поделиться

Если Вы протестируете на функции массива, то она будет работать на все границы:

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
28
ответ дан Lance Roberts 24 November 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: