if f.exists = false generates NilObjectException

Is there something wrong with the following statement?

if f.exists = false then

It generates NilObjectException when the file is known to not exist.
This has been a standard way to avoid NilObjectException and is under folderitem.exists

I would expect f is nil when the exception is raised!?

No. Just to clear Nil usually shows in the debugger such that you have the name and then Nil, but here I have folderitem underlined and I can look inside and the program gave it a path which doesn’t exist. I am trying to isolate text from what I call a partial path that gets turned into a folderitem, but this one doesn’t exist definitely.

No, that’s not a standard way to avoid NilobjectException. You’ll need to check for nil first:

if f<>nil and not(f.exists) then
…f was nil OR file does not exist…

I tried this code that doesn’t work.

       if Nil <> App.PlayWordP or Not(App.PlayWordP.Exists) Then

I think that is what you wrote.

You can’t compare nil to something, you have to compare something to nil. Also, it has to be AND, not OR:

if App.PlayWordP<>nil AND Not(App.PlayWordP.Exists) Then

No, you need to use an “And” there.

If App.PlaywordP <> Nil And Not App.PlayWordP.Exists Then

If you use “Or” then both sides are evaluated. With “And”, then 2nd side is evaluated only when App.PlaywordP <> Nil.

I usually do that. In this case it doesn’t matter for coding. I know that it isn’t nil since it has a path. My problem is the NilObjectException being raised on the line.

the statement only has two items.
one of those MUST be nil to get that error, no matter what you say.

FALSE is a reserved word. You shouldn’t be able to create an object called FALSE, so let’s assume you didn’t.

Try this:

[code]if f <> nil then
if not f.exists then
msgbox "File does not exist "
end if

if f.exists = false then 'IF this line causes an exception, you did something very odd with FALSE
msgbox "File does not exist… second test "
end if

msgbox "File is null "

if (Nil <> App.PlayWordP) AND App.PlayWordP.Exists Then // the folder item is not nil & the item exists

OR stated the other way so you deal with the BAD case

if (Nil = App.PlayWordP) OR NOT(App.PlayWordP.Exists) Then // the folder item is nil OR the item DOES NOT exist

should be fine

Sorry. I got lost in my variable names and clicked one I thought was the same ‘f’ when it wasn’t.
Since I’d already tested the variable App.PlayWordP and it had returned Nil from the test, the code I needed was/is

if Nil = App.PlayWordP Then, but I’d used f and wasn’t paying attention to names only to ‘exists’. It dawned on me eventually to check the name. Thanks

I’m also facing with this particular issue, I got Nil Object Exception when I delete the folder from its path:

#Pragma NilObjectChecking OFF try SourceXMLFile = SpecialFolder.Documents.Child("Invoices").Child(Selector(1)).child(RFC).Child(YearRow).child(Month).child(RazonORFC).Child(folioUUID+".xml") SourcePDFFile = SpecialFolder.Documents.Child("Invoices").Child(Selector(1)).child(RFC).Child(YearRow).child(Month).child(RazonORFC).Child(folioUUID+".pdf") If (Nil = SourceXMLFile) or Not(SourceXMLFile.Exists) Then MsgBox "El folder esta vacio o el Item no existe" Else Msgbox "Si existe el archivo" End If

Even I tried with Pragma without success, When I do NilObjectChecking FALSE
The Program Crashes

Any clues?

You can either use the pragma #Pragma Break On Exceptions Off or simply resume in the IDE to test the Try/Catch block.

You are great Sir!, Thanks so much

I found very often much more readable to compare against an object type with the IsA operator.

if f isA FolderItem then

[quote=319484:@Massimo Valle]I found very often much more readable to compare against an object type with the IsA operator.

if f isA FolderItem then [/quote]

Agree, except I use the generic “object”. That way if I decide to change the class of the thing I’m testing later, the code will still work.

if f isa object then ...

[quote=319485:@Kem Tekinay]Agree, except I use the generic “object”. That way if I decide to change the class of the thing I’m testing later, the code will still work.

if f isa object then ... [/quote]
except if the item has to be a specific type then this code doesn’t help you in that regard

say you have a super and several subclasses and you do

dim f as mySuperClass
f = new oneSubclass
... a bunch of other code ...
if f isa object then ...

all you know is that it is an object when maybe you needed to know it is a specific subclass
That said having to know its a specific subclass is more likely a design problem with the class hierarchy

And you probably dont want the “isa Object” check with “variant.ObjectValue” since that could be any object

I completely agree with Norman on that!

isA Object is kind of evil.

I thought we were talking specifically about if not (f is nil) then.... I was recommending ... isa object ... as a more readable alternative to that. Naturally if you have to test for a specific type of object, you should do that.

stylistically I would not write

if not (f is nil) then
  // code that I want to run
  // deal with nil
end if

Why not ?
The “good code path” is buried in the “then” part and ends up possibly deeply nested inside if’s
So I tend to test for criteria that I reject like

if f is nil then
  // deal with nil
  // possibly a return
end if


if f is nil then
  // deal with nil

end if

so the “good code path” is not buried in the “Then” portion and possible having a ton of trailing “else’s”

And yes I often return early so I can write

if f is nil then
  // deal with nil
  // return
end if
// good code

It amounts to asserting early often & bailing out as soon as possible
And it will offend anyone who believes heavily in “Enter once leave once”