IDEA-162158 (Inspection incorrectly suggests to collapse "catch" blocks)
[idea/community.git] / plugins / InspectionGadgets / test / com / siyeh / igtest / errorhandling / try_identical_catches / TryIdenticalCatches.java
1 package com.siyeh.igtest.errorhandling.try_identical_catches;
2
3 import java.io.*;
4
5 class TryIdenticalCatches {
6   public void notIdentical() {
7     try {
8
9     }
10     catch(NumberFormatException e) {
11       log(e);
12     }
13     catch(RuntimeException e) {
14       throw e;
15     }
16   }
17
18   String nonIdenticalButDuplicated(Object o) {
19         try {
20         } catch (NullPointerException e) {
21             if (o instanceof String) {
22                 return a((String) o);
23             }
24         } catch (NumberFormatException e) {
25             if (o instanceof String) {
26                 return b((String) o);
27             }
28         }
29         return null;
30   }
31
32   String a(String s) { return s;}
33   String b(String s) { return s;}
34
35
36   public void nonIdenticalWithParameterValue() throws StorageException {
37     try {
38       throwAllExceptions();
39     }
40     catch (StorageInitializationException e) {
41       throw e;
42     }
43     catch (java.io.IOException e) {
44       throw new StorageInitializationException("Can not setup storage factory.", e);
45     }
46     catch (Exception e) {
47       throw new StorageInitializationException("Unspecified exception occurs while DB storage initialization.", e);
48     }
49   }
50
51   void throwAllExceptions() throws StorageInitializationException, java.io.IOException {
52   }
53
54   class StorageException extends Exception {
55   }
56
57   class StorageInitializationException extends StorageException {
58     private StorageInitializationException(String m, Exception e) {
59     }
60   }
61
62   public void identicalWithoutParams(boolean value) {
63      try {
64        if (value) {
65          throw new ClassNotFoundException();
66        }
67        else {
68          throw new NumberFormatException();
69        }
70      }
71      catch(ClassNotFoundException cnfe) {
72        System.out.println();
73      }
74      <warning descr="'catch' branch identical to 'ClassNotFoundException' branch">catch(NumberFormatException nfe)</warning> {
75       System.out.println();
76      }
77    }
78
79   public void identical(boolean value) {
80     try {
81       if (value) {
82         throw new ClassNotFoundException();
83       }
84       else {
85         throw new NumberFormatException();
86       }
87     }
88     catch(ClassNotFoundException cnfe) {
89       log(cnfe);
90     }
91     <warning descr="'catch' branch identical to 'ClassNotFoundException' branch">catch(NumberFormatException n<caret>fe)</warning> {
92       log(nfe);
93     }
94   }
95
96   private void log(Exception e) {
97   }
98
99   class E1 extends RuntimeException {}
100   class E2 extends E1 {}
101   class E3 extends RuntimeException {}
102   class E4 extends E3 {}
103
104   void p() {
105     try {
106
107     } catch (E4 e) {
108     } <warning descr="'catch' branch identical to 'E4' branch">catch (E2 e)</warning> {
109     } <warning descr="'catch' branch identical to 'E4' branch">catch (E3 e)</warning> {
110     } <warning descr="'catch' branch identical to 'E2' branch">catch (E1 e)</warning> {
111     }
112   }
113
114   void q() {
115     try {
116       Class.forName("bla").newInstance();
117     } catch (ClassNotFoundException e) {
118       e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
119     } catch (<error descr="Cannot resolve symbol 'InstantiationException'">InstantiationException</error><error descr="Identifier expected"> </error>) {
120       <error descr="Cannot resolve symbol 'e'">e</error>.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
121     } catch (IllegalAccessException e) {
122       e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
123     }
124   }
125
126   public static void main() {
127     Throwable causeException;
128     try {
129       throw new NullPointerException();
130     } catch (final NullPointerException e) {
131       causeException = e;
132     } <warning descr="'catch' branch identical to 'NullPointerException' branch">catch (final IllegalArgumentException e)</warning> {
133       causeException = e;
134     } <warning descr="'catch' branch identical to 'NullPointerException' branch">catch (final IndexOutOfBoundsException e)</warning> {
135       causeException = e;
136     }
137     System.out.println("causeException = " + causeException);
138   }
139
140   public void x() throws IOException {
141     try {
142       foo();
143     } catch (FileNotFoundException e) {
144       throw e;
145     } catch (IOException e) {
146       throw INSTANCE;
147     }
148   }
149
150   public void y() throws IOException {
151     try {
152
153     } catch (RuntimeException g) {
154       try {
155         foo();
156       } catch (FileNotFoundException e) {
157         throw e;
158       } catch (IOException e) {
159         throw g;
160       }
161     }
162   }
163
164   void foo() throws IOException {}
165   private static final IOException INSTANCE = new IOException();
166
167   public boolean returning() {
168     try {
169       // work
170     }
171     catch(NumberFormatException e) {
172       return true;
173     }
174     <warning descr="'catch' branch identical to 'NumberFormatException' branch">catch(RuntimeException e)</warning> {
175       return true;
176     }
177     return false;
178   }
179
180   public void suppress() {
181     try {
182       // ...
183     }
184     catch (NumberFormatException e) {
185       System.out.println(e);
186     }
187     catch (@SuppressWarnings("TryWithIdenticalCatches") RuntimeException e) {
188       System.out.println(e);
189     }
190   }
191 }
192 class TestInspection {
193   public void foo() throws MyException {
194     try {
195       toString();
196     } catch (IllegalArgumentException e) {
197       throw new MyException(e);
198     } catch (IllegalStateException e) {
199       throw new MyException(e);
200     }
201   }
202
203   private static class MyException extends Exception {
204     public MyException(IllegalArgumentException e) {}
205
206     public MyException(IllegalStateException e) {}
207   }
208 }