IMO, sprawdzone wyjątki są wadliwą implementacją czegoś, co mogłoby być całkiem przyzwoitym pomysłem (w zupełnie innych okolicznościach - ale tak naprawdę nie jest nawet dobrym pomysłem w obecnych okolicznościach).
Dobrym pomysłem jest to, że dobrze byłoby, gdyby kompilator sprawdził, czy wszystkie wyjątki, które program może wyrzucić, zostaną wychwycone. Wadliwa implementacja polega na tym, że aby to zrobić, Java zmusza cię do radzenia sobie z wyjątkiem bezpośrednio w dowolnej klasie wywołującej wszystko, co zadeklarowano, aby zgłosić wyjątek sprawdzony. Jednym z najbardziej podstawowych pomysłów (i zalet) obsługi wyjątków jest to, że w przypadku błędu pozwala pośrednim warstwom kodu, które nie mają nic wspólnego z konkretnym błędem, całkowicie zignorować jego istnienie. Sprawdzone wyjątki (zaimplementowane w Javie) nie pozwalają na to, a zatem niszczą główną (podstawową?) Zaletę obsługi wyjątków na początek.
Teoretycznie mogliby sprawić, by sprawdzone wyjątki były przydatne, wymuszając je tylko na poziomie całego programu - tzn. Podczas „budowania” programu buduj drzewo wszystkich ścieżek sterowania w programie. Różne węzły w drzewie będą opatrzone adnotacjami z 1) wyjątkami, które mogą wygenerować, i 2) wyjątkami, które mogą wychwycić. Aby upewnić się, że program był poprawny, chodzisz po drzewie, sprawdzając, czy każdy wyjątek zgłoszony na dowolnym poziomie drzewa został przechwycony na wyższym poziomie w drzewie.
Powodem, dla którego tego nie zrobili (i tak sądzę), jest to, że byłoby to niezwykle trudne - w rzeczywistości wątpię, aby ktokolwiek napisał system kompilacji, który mógłby to zrobić dla czegoś innego niż niezwykle proste (graniczy z „zabawką” „) języki / systemy. W przypadku Javy rzeczy takie jak dynamiczne ładowanie klas czynią to jeszcze trudniejszym niż w wielu innych przypadkach. Co gorsza (w przeciwieństwie do C) Java nie jest (przynajmniej normalnie) statycznie kompilowana / powiązana z plikiem wykonywalnym. Oznacza to, że nic w systemie nie ma tak naprawdę globalnej świadomości, aby nawet próbować wykonać takie egzekwowanie, dopóki użytkownik końcowy nie zacznie faktycznie ładować programu, aby go uruchomić.
Wykonanie egzekucji w tym momencie jest niepraktyczne z kilku powodów. Przede wszystkim, nawet w najlepszym przypadku wydłużyłoby czas uruchamiania, które są już jedną z największych, najczęstszych skarg na Javę. Po drugie, aby zrobić wiele dobrego, naprawdę musisz wykryć problem wystarczająco wcześnie, aby programista mógł go naprawić. Gdy użytkownik ładuje program, jest już za późno, aby zrobić wiele dobrego - jedyne, co możesz zrobić, to zignorować problem lub w ogóle odmówić załadowania / uruchomienia programu, ponieważ istnieje ryzyko, że może istnieć wyjątek to nie zostało złapane.
W tej chwili sprawdzone wyjątki są gorsze niż bezużyteczne, ale alternatywne projekty sprawdzonych wyjątków są jeszcze gorsze. Chociaż podstawowy pomysł na sprawdzone wyjątki wydaje się dobry, to naprawdę nie jest zbyt dobry i okazuje się, że jest szczególnie nieodpowiedni dla Javy. W przypadku czegoś takiego jak C ++, który zwykle jest kompilowany / łączony w kompletny plik wykonywalny z niczym innym, jak odbiciem / dynamicznym ładowaniem klas, miałbyś trochę większą szansę (choć, szczerze mówiąc, nawet wtedy egzekwując je poprawnie bez tego samego bałaganu, jaki oni obecnie przyczyna w Javie prawdopodobnie nadal wykraczałaby poza obecny stan wiedzy).