Unreachable catch classes

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Apr 27 08:35:33 UTC 2011


On 27/04/11 09:18, David Holmes wrote:
> Maurizio Cimadamore said the following on 04/27/11 18:05:
>> On 27/04/11 03:42, David Holmes wrote:
>>> I sent email to coin-dev on this yesterday but it doesn't seem to 
>>> have turned up - at least I haven't seen it.
>>>
>>> In some cases at least these catch clauses are in fact reachable - 
>>> e.g. ThreadPoolExecutor. The analysis assumes that 
>>> checked-exceptions can only be thrown by methods that declare them, 
>>> but we all know that is not the case: Class.newInstance and native 
>>> methods can throw them too (are there other cases?). So sometimes we 
>>> want the "unreachable" catch as a "safety-net" for these cases.
>>>
>>> Given checked-exception checks can be circumvented it seems to me 
>>> that the analysis should not be issuing warnings for these cases 
>>> because it will encourage people to "fix the code" - as you have 
>>> just asked to be done! - when in fact the code could be less robust 
>>> if it is changed.
>> I see your concerns - unfortunately there is no way to statically 
>> distinguish 'good' cases from 'bad' cases - i.e. a call to 
>> Class.newInstance could be hidden behind a method called inside the 
>> try-block. So, it seems like the only sensible option would be to 
>> special case 'catch(Throwable)'.
>
> Special-casing Throwable wouldn't be sufficient as people may use 
> Exception instead.
>
> What I suggested on coin-dev ( which has finally turned up now that 
> someone has unblocked the openjdk mail pipes ;-) ) is that instead of 
> doing an analysis of the expected thrown types, to simply warn for the 
> more common mistake of catching a superclass before a subclass.

So, you are saying that the JDK 7 compiler should stop generating 
additional warnings, and start behaving as usual (we always had errors 
when catching supertype after subtype, and such).

Maurizio
>
> David
>
>> Maurizio
>>>
>>> Cheers,
>>> David
>>>
>>> Joe Darcy said the following on 04/27/11 11:53:
>>>> Hello.
>>>>
>>>> FYI, javac in JDK 7 does a more precise analysis than before on 
>>>> what catch blocks can actually be reached and warnings are issued 
>>>> for unreachable catch blocks.  I've extracted those warnings from a 
>>>> recent full JDK build in case anyone wants to update the code in 
>>>> question.
>>>>
>>>> -Joe
>>>>
>>>> ../../../../../../src/share/classes/com/sun/corba/se/impl/protocol/BootstrapServerRequestDispatcher.java:124: 
>>>> warning: unreachable catch clause
>>>>        } catch (java.lang.Exception ex) {
>>>>          ^
>>>>  thrown type RuntimeException has already been caught
>>>>
>>>> ../../../../../../src/share/classes/com/sun/corba/se/impl/protocol/BootstrapServerRequestDispatcher.java:124: 
>>>> warning: unreachable catch clause
>>>>        } catch (java.lang.Exception ex) {
>>>>          ^
>>>>  thrown type RuntimeException has already been caught
>>>>
>>>> ../../../src/share/classes/java/util/concurrent/ThreadPoolExecutor.java:1115: 
>>>> warning: unreachable catch clause
>>>>                    } catch (Throwable x) {
>>>>                      ^
>>>>  thrown types RuntimeException,Error have already been caught
>>>> ../../../src/share/classes/java/net/DatagramSocket.java:183: 
>>>> warning: unreachable catch clause
>>>>        } catch(IOException e) {
>>>>          ^
>>>>  thrown type SocketException has already been caught
>>>> Note: Some input files use or override a deprecated API.
>>>> Note: Recompile with -Xlint:deprecation for details.
>>>> Note: Some input files use unchecked or unsafe operations.
>>>> Note: Recompile with -Xlint:unchecked for details.
>>>> 2 warnings
>>>>
>>>> ../../../src/share/classes/java/security/cert/X509CertSelector.java:2217: 
>>>> warning: unreachable catch clause
>>>>        } catch (CertificateException e3) {
>>>>          ^
>>>>  thrown types 
>>>> CertificateNotYetValidException,CertificateExpiredException have 
>>>> already been caught
>>>>
>>>> ../../../src/share/classes/javax/management/modelmbean/RequiredModelMBean.java:1220: 
>>>> warning: unreachable catch clause
>>>>        } catch (Exception e) {
>>>>          ^
>>>>  thrown types 
>>>> InvocationTargetException,IllegalAccessException,RuntimeException 
>>>> have already been caught
>>>> 1 warning
>>>>
>>>> ../../../../src/share/classes/sun/security/rsa/RSASignature.java:205: 
>>>> warning: unreachable catch clause
>>>>        } catch (GeneralSecurityException e) {
>>>>          ^
>>>>  thrown type BadPaddingException has already been caught
>>>>
>>>>
>>




More information about the core-libs-dev mailing list