Source code: com/puppycrawl/tools/checkstyle/checks/design/ThrowsCountCheck.java
1 ////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code for adherence to a set of rules.
3 // Copyright (C) 2001-2003 Oliver Burn
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 ////////////////////////////////////////////////////////////////////////////////
19 package com.puppycrawl.tools.checkstyle.checks.design;
20
21 import com.puppycrawl.tools.checkstyle.api.DetailAST;
22 import com.puppycrawl.tools.checkstyle.api.Check;
23 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24
25 /**
26 * <p>
27 * Restricts throws statements to a specified count (default = 1).
28 * </p>
29 * <p>
30 * Rationale:
31 * Exceptions form part of a methods interface. Declaring
32 * a method to throw too many differently rooted
33 * exceptions makes exception handling onerous and leads
34 * to poor programming practices such as catch
35 * (Exception). This check forces developers to put
36 * exceptions into a heirachy such that in the simplest
37 * case, only one type of exception need be checked for by
38 * a caller but allows any sub-classes to be caught
39 * specifically if necessary.
40 * </p>
41 * @author <a href="mailto:simon@redhillconsulting.com.au">Simon Harris</a>
42 */
43 public final class ThrowsCountCheck extends Check
44 {
45 /** default value of max property */
46 private static final int DEFAULT_MAX = 1;
47
48 /** maximum allowed throws statments */
49 private int mMax;
50
51 /** Creates new instance of the check. */
52 public ThrowsCountCheck()
53 {
54 setMax(DEFAULT_MAX);
55 }
56
57 /** @see Check */
58 public int[] getDefaultTokens()
59 {
60 return new int[] {
61 TokenTypes.LITERAL_THROWS,
62 };
63 }
64
65 /** @see Check */
66 public int[] getRequiredTokens()
67 {
68 return getDefaultTokens();
69 }
70
71 /**
72 * Getter for max property.
73 * @return maximum allowed throws statements.
74 */
75 public int getMax()
76 {
77 return mMax;
78 }
79
80 /**
81 * Setter for max property.
82 * @param aMax maximum allowed throws statements.
83 */
84 public void setMax(int aMax)
85 {
86 mMax = aMax;
87 }
88
89 /** @see Check */
90 public void visitToken(DetailAST aAST)
91 {
92 switch (aAST.getType()) {
93 case TokenTypes.LITERAL_THROWS:
94 visitLiteralThrows(aAST);
95 break;
96 default:
97 throw new IllegalStateException(aAST.toString());
98 }
99 }
100
101 /**
102 * Checks number of throws statments.
103 * @param aAST throws for check.
104 */
105 private void visitLiteralThrows(DetailAST aAST)
106 {
107 // Account for all the commas!
108 int count = (aAST.getChildCount() + 1) / 2;
109 if (count > getMax()) {
110 log(aAST.getLineNo(), aAST.getColumnNo(), "throws.count",
111 new Integer(count), new Integer(getMax()));
112 }
113 }
114 }