Java uses throw. Not occasionally or Incidentally but idiomatically. You can’t write Java without throw.
Throw is THE WORST THING that ever happened to programming. Throw introduces a dual control flow, adding to the if/else/while/for system. Throw creates code that cannot be reliably analyzed.
I have switched from C++ to C# because I can write C# without throw. In 30 months of managing servers I never had to use throw once and I removed the instances already in the code. Servers became more stable.
I was one of the very first people not working at AT&T to learn C++; I will not use it now. It has become unrecognizable. Throw has ruined it.
The original idea was that actual exceptions would be handled more gracefully than an epitaph from the operating system; disk full, network disconnect, address exception. In the hands of morons throw is used to save a few minutes of typing. When throw became part of commonly-used languages we all saw a sharp drop in software stability. Applications that had formerly been beautifully stable were crashing right and left. Two decades later they are better but still not as stable as they were.
I need to learn Java to get a job here in Cần Thơ. It will take me a few days. I learn fast. I will use return codes instead of throw everywhere I can.