View Javadoc
1   /*
2    * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package java.util.regex;
27  
28  import sun.security.action.GetPropertyAction;
29  
30  
31  /**
32   * Unchecked exception thrown to indicate a syntax error in a
33   * regular-expression pattern.
34   *
35   * @author  unascribed
36   * @since 1.4
37   * @spec JSR-51
38   */
39  
40  public class PatternSyntaxException
41      extends IllegalArgumentException
42  {
43      private static final long serialVersionUID = -3864639126226059218L;
44  
45      private final String desc;
46      private final String pattern;
47      private final int index;
48  
49      /**
50       * Constructs a new instance of this class.
51       *
52       * @param  desc
53       *         A description of the error
54       *
55       * @param  regex
56       *         The erroneous pattern
57       *
58       * @param  index
59       *         The approximate index in the pattern of the error,
60       *         or <tt>-1</tt> if the index is not known
61       */
62      public PatternSyntaxException(String desc, String regex, int index) {
63          this.desc = desc;
64          this.pattern = regex;
65          this.index = index;
66      }
67  
68      /**
69       * Retrieves the error index.
70       *
71       * @return  The approximate index in the pattern of the error,
72       *         or <tt>-1</tt> if the index is not known
73       */
74      public int getIndex() {
75          return index;
76      }
77  
78      /**
79       * Retrieves the description of the error.
80       *
81       * @return  The description of the error
82       */
83      public String getDescription() {
84          return desc;
85      }
86  
87      /**
88       * Retrieves the erroneous regular-expression pattern.
89       *
90       * @return  The erroneous pattern
91       */
92      public String getPattern() {
93          return pattern;
94      }
95  
96      private static final String nl =
97          java.security.AccessController
98              .doPrivileged(new GetPropertyAction("line.separator"));
99  
100     /**
101      * Returns a multi-line string containing the description of the syntax
102      * error and its index, the erroneous regular-expression pattern, and a
103      * visual indication of the error index within the pattern.
104      *
105      * @return  The full detail message
106      */
107     public String getMessage() {
108         StringBuffer sb = new StringBuffer();
109         sb.append(desc);
110         if (index >= 0) {
111             sb.append(" near index ");
112             sb.append(index);
113         }
114         sb.append(nl);
115         sb.append(pattern);
116         if (index >= 0) {
117             sb.append(nl);
118             for (int i = 0; i < index; i++) sb.append(' ');
119             sb.append('^');
120         }
121         return sb.toString();
122     }
123 
124 }