package com.siyeh.igtest.errorhandling.try_identical_catches; import java.io.*; class TryIdenticalCatches { public void notIdentical() { try { } catch(NumberFormatException e) { log(e); } catch(RuntimeException e) { throw e; } } String nonIdenticalButDuplicated(Object o) { try { } catch (NullPointerException e) { if (o instanceof String) { return a((String) o); } } catch (NumberFormatException e) { if (o instanceof String) { return b((String) o); } } return null; } String a(String s) { return s;} String b(String s) { return s;} public void nonIdenticalWithParameterValue() throws StorageException { try { throwAllExceptions(); } catch (StorageInitializationException e) { throw e; } catch (java.io.IOException e) { throw new StorageInitializationException("Can not setup storage factory.", e); } catch (Exception e) { throw new StorageInitializationException("Unspecified exception occurs while DB storage initialization.", e); } } void throwAllExceptions() throws StorageInitializationException, java.io.IOException { } class StorageException extends Exception { } class StorageInitializationException extends StorageException { private StorageInitializationException(String m, Exception e) { } } public void identicalWithoutParams(boolean value) { try { if (value) { throw new ClassNotFoundException(); } else { throw new NumberFormatException(); } } catch(ClassNotFoundException cnfe) { System.out.println(); } <warning descr="'catch' branch identical to 'ClassNotFoundException' branch">catch(NumberFormatException nfe)</warning> { System.out.println(); } } public void identical(boolean value) { try { if (value) { throw new ClassNotFoundException(); } else { throw new NumberFormatException(); } } catch(ClassNotFoundException cnfe) { log(cnfe); } <warning descr="'catch' branch identical to 'ClassNotFoundException' branch">catch(NumberFormatException n<caret>fe)</warning> { log(nfe); } } private void log(Exception e) { } class E1 extends RuntimeException {} class E2 extends E1 {} class E3 extends RuntimeException {} class E4 extends E3 {} void p() { try { } catch (E4 e) { } <warning descr="'catch' branch identical to 'E4' branch">catch (E2 e)</warning> { } <warning descr="'catch' branch identical to 'E4' branch">catch (E3 e)</warning> { } <warning descr="'catch' branch identical to 'E2' branch">catch (E1 e)</warning> { } } void q() { try { Class.forName("bla").newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (<error descr="Cannot resolve symbol 'InstantiationException'">InstantiationException</error><error descr="Identifier expected"> </error>) { <error descr="Cannot resolve symbol 'e'">e</error>.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IllegalAccessException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } public static void main() { Throwable causeException; try { throw new NullPointerException(); } catch (final NullPointerException e) { causeException = e; } <warning descr="'catch' branch identical to 'NullPointerException' branch">catch (final IllegalArgumentException e)</warning> { causeException = e; } <warning descr="'catch' branch identical to 'NullPointerException' branch">catch (final IndexOutOfBoundsException e)</warning> { causeException = e; } System.out.println("causeException = " + causeException); } public void x() throws IOException { try { foo(); } catch (FileNotFoundException e) { throw e; } catch (IOException e) { throw INSTANCE; } } public void y() throws IOException { try { } catch (RuntimeException g) { try { foo(); } catch (FileNotFoundException e) { throw e; } catch (IOException e) { throw g; } } } void foo() throws IOException {} private static final IOException INSTANCE = new IOException(); public boolean returning() { try { // work } catch(NumberFormatException e) { return true; } <warning descr="'catch' branch identical to 'NumberFormatException' branch">catch(RuntimeException e)</warning> { return true; } return false; } public void suppress() { try { // ... } catch (NumberFormatException e) { System.out.println(e); } catch (@SuppressWarnings("TryWithIdenticalCatches") RuntimeException e) { System.out.println(e); } } } class TestInspection { public void foo() throws MyException { try { toString(); } catch (IllegalArgumentException e) { throw new MyException(e); } catch (IllegalStateException e) { throw new MyException(e); } } private static class MyException extends Exception { public MyException(IllegalArgumentException e) {} public MyException(IllegalStateException e) {} } }