|
10 | 10 | 例如,下面是一个新的异常的允许定义,它包含一个整数值:
|
11 | 11 |
|
12 | 12 | ```java
|
13 |
| - class IntegerException extends Exception { |
14 |
| - private final int value; |
15 |
| - public IntegerException(int value) { this.value = value; } |
16 |
| - public int getValue() { return value; } |
17 |
| - } |
| 13 | +class IntegerException extends Exception { |
| 14 | + private final int value; |
| 15 | + public IntegerException(int value) { |
| 16 | + this.value = value; |
| 17 | + } |
| 18 | + public int getValue() { |
| 19 | + return value; |
| 20 | + } |
| 21 | +} |
18 | 22 | ```
|
19 | 23 |
|
20 | 24 | 这里是一个简单的例子,说明如何使用异常:
|
21 | 25 |
|
22 | 26 | ```java
|
23 |
| - class IntegerExceptionTest { |
24 |
| - public static void main(String[] args) { |
25 |
| - try { |
26 |
| - throw new IntegerException(42); |
27 |
| - } catch (IntegerException e) { |
28 |
| - assert e.getValue() == 42; |
29 |
| - } |
30 |
| - } |
| 27 | +class IntegerExceptionTest { |
| 28 | + public static void main(String[] args) { |
| 29 | + try { |
| 30 | + throw new IntegerException(42); |
| 31 | + } catch (IntegerException e) { |
| 32 | + assert e.getValue() == 42; |
31 | 33 | }
|
| 34 | + } |
| 35 | +} |
32 | 36 | ```
|
33 | 37 |
|
34 | 38 | `try` 语句的主体用 `catch` 语句捕获的给定值抛出异常。
|
35 | 39 |
|
36 | 40 | 相反,以下定义的新异常是禁止的,因为它创建了一个参数化类型:
|
37 | 41 |
|
38 | 42 | ```java
|
39 |
| - class ParametricException<T> extends Exception { // 编译报错 |
40 |
| - private final T value; |
41 |
| - public ParametricException(T value) { this.value = value; } |
42 |
| - public T getValue() { return value; } |
43 |
| - } |
| 43 | +class ParametricException<T> extends Exception { // 编译报错 |
| 44 | + private final T value; |
| 45 | + public ParametricException(T value) { |
| 46 | + this.value = value; |
| 47 | + } |
| 48 | + public T getValue() { |
| 49 | + return value; |
| 50 | + } |
| 51 | +} |
44 | 52 | ```
|
45 | 53 |
|
46 | 54 | 试图编译上述报告错误:
|
47 | 55 |
|
48 | 56 | ```java
|
49 |
| - % javac ParametricException.java |
50 |
| - ParametricException.java:1: a generic class may not extend |
51 |
| - java.lang.Throwable |
52 |
| - class ParametricException<T> extends Exception { // 编译报错 |
53 |
| - ^ |
54 |
| - 1 error |
| 57 | +% javac ParametricException.java |
| 58 | +ParametricException.java:1: a generic class may not extend |
| 59 | +java.lang.Throwable |
| 60 | +class ParametricException<T> extends Exception { // 编译报错 |
| 61 | + ^ |
| 62 | +1 error |
55 | 63 | ```
|
56 | 64 |
|
57 | 65 | 这种限制是明智的,因为几乎任何捕捉这种异常的尝试都必须失败,因为该类型不可确定。 人们可能会期望典型的例外使用如下所示:
|
58 | 66 |
|
59 | 67 | ```java
|
60 |
| - class ParametricExceptionTest { |
61 |
| - public static void main(String[] args) { |
62 |
| - try { |
63 |
| - throw new ParametricException<Integer>(42); |
64 |
| - } catch (ParametricException<Integer> e) { // compile-time error |
65 |
| - assert e.getValue()==42; |
66 |
| - } |
67 |
| - } |
68 |
| - } |
| 68 | +class ParametricExceptionTest { |
| 69 | + public static void main(String[] args) { |
| 70 | + try { |
| 71 | + throw new ParametricException<Integer>(42); |
| 72 | + } catch (ParametricException<Integer> e) { // compile-time error |
| 73 | + assert e.getValue()==42; |
| 74 | + } |
| 75 | + } |
| 76 | +} |
69 | 77 | ```
|
70 | 78 |
|
71 | 79 | 这是不允许的,因为 `catch` 子句中的类型是不可确定的。 在撰写本文时,`Sun` 编译器在这种情况下报告了一系列语法错误:
|
72 | 80 |
|
73 | 81 | ```java
|
74 |
| - % javac ParametricExceptionTest.java |
75 |
| - ParametricExceptionTest.java:5: <identifier> expected |
76 |
| - } catch (ParametricException<Integer> e) { |
77 |
| - ^ |
78 |
| - ParametricExceptionTest.java:8: ')' expected |
79 |
| - } |
80 |
| - ^ |
81 |
| - ParametricExceptionTest.java:9: '}' expected |
82 |
| - } |
83 |
| - ^ |
84 |
| - 3 errors |
| 82 | +% javac ParametricExceptionTest.java |
| 83 | +ParametricExceptionTest.java:5: <identifier> expected |
| 84 | +} catch (ParametricException<Integer> e) { |
| 85 | + ^ |
| 86 | +ParametricExceptionTest.java:8: ')' expected |
| 87 | +} |
| 88 | +^ |
| 89 | +ParametricExceptionTest.java:9: '}' expected |
| 90 | +} |
| 91 | +^ |
| 92 | +3 errors |
85 | 93 | ```
|
86 | 94 |
|
87 | 95 | 由于异常不能是参数化的,因此语法受到限制,因此必须将该类型编写为标识符,而没有以下参数。
|
|
0 commit comments