Garbage collection will eventually find the old object and finalize it. This is not quite the same as disposal, and it requires the object to survive an extra GC generation as it is put on the finalizer thread. (See the long story below)
You should either be using different variable names (good practise anyway) and disposing of both, or disposing of the first before you overwrite the variable with the second.
The best way of doing it would be to use a using statement to make sure that the objects are definitely disposed of, that way you don't need the try/catch at all.
Using x as new whatever(1)
something is done with x
End using
Using y as new whatever(2)
something is done with y
End using
[Edit: The long story. You dereference the first x. Then at some point in the future the GC runs, it detects that the first X doesn't have any roots. If the object has a finalizer then it puts a reference to the object on the finalizer thread - note that just because an object is disposable doesn't necessarily mean the object itself has a finalizer, but something somewhere within the object or subobjects will almost certainly have one. This means the object - or subobject - survives the GC run, so gets promoted to generation 1. Then the finalizer runs and finalizes all the objects on the finalizer thread which releases their unmanaged memory. Then you have to wait for the GC to run again, but this time you have to wait for a generation 1 collection, which are much rarer, but when it eventually does happen, your object will finally get collected]