I don't write business software that needs many 9s of uptime so I find null to be fine. Yes, returning null is kind of throwing your hands up but I find that to be kind of the point. It allows my software to fail fast if it does and makes it incredibly obvious where things are going wrong. Generally if a reference has a value of null where it shouldn't, I can pinpoint the location of the bug within a few minutes or even seconds.
IMO it makes the program much easier to reason about compared to returning some sort of empty value and then failing much much later in the program.
IMO it makes the program much easier to reason about compared to returning some sort of empty value and then failing much much later in the program.