My guess as to why it doesn't crash in the first two cases is a matter of timing.
IIRC, VB.net can actually return 'Not a number'. I suspect when it initializes, the text boxes start out blank, and every time they get changed during initialization, the changed methods get called.
When it calls the first two, point2x isn't initialized. It returns not a number, so (valPoint2X.Value - valPoint1X.Value)) * valPoint1X.Value)) is also not a number. Once point2x get initialized though, all the values in the divisor are numbers, and they add up to zero. Dividing by not a number just gets you not a number. Dividing by zero....is bad.