1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100078.html;106,k100080.html;107,k100082.html;108,k100083.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100078.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100080.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100082.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 12 - Exceptions
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id012003"></a>
<h2>12.3 Weitergabe von Exceptions </h2>
<hr>
<ul>
<li><a href="k100081.html#sectlevel2id012003">12.3 Weitergabe von Exceptions</a>
<ul>
<li><a href="k100081.html#sectlevel3id012003001">12.3.1 Die catch-or-throw-Regel</a>
<li><a href="k100081.html#sectlevel3id012003002">12.3.2 Weitergabe einer Exception</a>
<ul>
<li><a href="k100081.html#sectlevel4id012003002001">Die Klasse RuntimeException</a>
</ul>
<li><a href="k100081.html#sectlevel3id012003003">12.3.3 Auslösen von Ausnahmen</a>
</ul>
</ul>
<hr>
<!-- Section -->
<a name="sectlevel3id012003001"></a>
<h3>12.3.1 Die <a name="ixa100736">catch-or-throw-Regel</a> </h3>
<p>
Bei der Behandlung von Ausnahmen in Java gibt es die Grundregel <i>catch
or throw</i>. Sie besagt, dass jede Ausnahme entweder <i>behandelt</i>
oder <i>weitergegeben</i> werden muss. Wie man Ausnahmen behandelt,
wurde anhand der <a href="index_t.html#ixb100569"><font color=#000080><tt>try</tt></font></a>-<a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Anweisung
in den vorherigen Abschnitten erklärt. Soll eine Ausnahme nicht
behandelt, sondern weitergegeben werden, so kann dies einfach dadurch
geschehen, dass eine geeignete <a href="index_t.html#ixb100569"><font color=#000080><tt>try</tt></font></a>-<a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Anweisung
nicht verwendet wird.
<p>
In der Regel gibt es dann jedoch zunächst einen Fehler beim Übersetzen
des Programms, denn der Compiler erwartet, dass jede mögliche
Ausnahme, die nicht behandelt, sondern weitergegeben wird, mit Hilfe
der <a href="index_t.html#ixb100471"><font color=#000080><tt>throws</tt></font></a>-Klausel
zu deklarieren ist. Dazu wird an das Ende des Methodenkopfes das Schlüsselwort
<a href="index_t.html#ixb100471"><font color=#000080><tt>throws</tt></font></a>
mit einer Liste aller Ausnahmen, die nicht behandelt werden sollen,
angehängt:
<a name="listingid012008"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#006699">void</font> SqrtTable()
<font color="#555555">002 </font><font color="#0000AA">throws</font> ArithmeticException
<font color="#555555">003 </font>{
<font color="#555555">004 </font> <font color="#006699">double</font> x = -1.0;
<font color="#555555">005 </font>
<font color="#555555">006 </font> <font color="#0000AA">while</font> (x <= 10.0) {
<font color="#555555">007 </font> System.out.println(<font color="#0000FF">"sqrt("</font>+x+<font color="#0000FF">")="</font>+Math.sqrt(x));
<font color="#555555">008 </font> x += 1.0;
<font color="#555555">009 </font> }
<font color="#555555">010 </font>}</pre>
</font>
</td>
</tr>
</table>
<i>
Listing 12.8: Verwendung der throws-Klausel</i></p>
<!-- Section -->
<a name="sectlevel3id012003002"></a>
<h3>12.3.2 <a name="ixa100737">Weitergabe einer Exception</a></h3>
<p>
Tritt eine Ausnahme ein, sucht das Laufzeitsystem zunächst nach
einer die Anweisung unmittelbar umgebenden <a href="index_t.html#ixb100569"><font color=#000080><tt>try</tt></font></a>-<a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Anweisung,
die diesen Fehler behandelt. Findet es eine solche nicht, wiederholt
es die Suche sukzessive in allen umgebenden Blöcken. Ist auch
das erfolglos, wird der Fehler an den Aufrufer der Methode weitergegeben.
Dort beginnt die Suche nach einem Fehler-Handler von neuem, und der
Fehler wird an die umgebenden Blöcke und schließlich an
den Aufrufer weitergereicht. Enthält auch die Hauptmethode keinen
Code, um den Fehler zu behandeln, bricht das Programm mit einer Fehlermeldung
ab.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Da alle Fehler, die nicht innerhalb einer Methode behandelt werden,
dem Compiler mit Hilfe der <a name="ixa100738"><a href="index_t.html#ixb100471"><font color=#000080><tt>throws</tt></font></a></a>-Klausel
bekanntgemacht werden, kennt dieser zu jeder Methode die potentiellen
Fehler, die von ihr verursacht werden können. Mit diesen Informationen
kann der Compiler bei jedem Methodenaufruf sicherstellen, dass der
Aufrufer seinerseits die <i>catch-or-throw</i>-Regel einhält.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel4id012003002001"></a>
<h4>Die Klasse RuntimeException </h4>
<p>
Um den Aufwand durch explizites Fehler-Handling bei der Entwicklung
von Java-Programmen nicht zu groß werden zu lassen, gibt es
eine Ausnahme von der <i>catch-or-throw</i>-Regel. Direkt unterhalb
der Klasse <a href="index_e.html#ixb100577"><font color=#000080><tt>Exception</tt></font></a>
gibt es die Klasse <a name="ixa100739"><a href="index_r.html#ixb100372"><font color=#000080><tt>RuntimeException</tt></font></a></a>.
Sie ist die Vaterklasse aller Laufzeitfehler, die zwar behandelt werden
<i>können</i>, aber nicht <i>müssen</i>. Der Programmierer
kann in diesem Fall selbst entscheiden, ob er den entsprechenden Fehler
behandeln will oder nicht.
<!-- Section -->
<a name="sectlevel3id012003003"></a>
<h3>12.3.3 Auslösen von Ausnahmen<a name="ixa100740"></a> </h3>
<p>
Wie schon erwähnt, sind Ausnahmeobjekte unter Java Instanzen
bestimmter Klassen und können somit behandelt werden wie andere
Objekte auch. Es ist also insbesondere möglich, ein Fehlerobjekt
zu instanzieren oder eigene Fehlerklassen aus den vorhandenen abzuleiten.
<p>
Das Erzeugen eines Objekts aus einer Fehlerklasse gleicht dem Erzeugen
eines Objekts aus einer beliebigen anderen Klasse. So legt die Anweisung
<font color="#000077"><tt>new ArithmeticException</tt></font> ein
neues Fehlerobjekt der Klasse <a name="ixa100741"><a href="index_a.html#ixb100582"><font color=#000080><tt>ArithmeticException</tt></font></a></a>
an, das einer Variablen des entsprechenden Typs zugewiesen werden
kann.
<p>
Mit Hilfe der <a name="ixa100742"><a href="index_t.html#ixb100347"><font color=#000080><tt>throw</tt></font></a></a>-Anweisung
kann ein solches Objekt dazu verwendet werden, eine Ausnahme zu erzeugen.
Die Syntax der <a href="index_t.html#ixb100347"><font color=#000080><tt>throw</tt></font></a>-Anweisung
ist:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
throw AusnahmeObjekt;
</pre>
</font>
</td>
</tr>
</table>
<p>
Die Behandlung dieser Fehler folgt den üblichen Regeln. Sie entspricht
damit genau dem Fall, wenn anstelle der <a href="index_t.html#ixb100347"><font color=#000080><tt>throw</tt></font></a>-Anweisung
eine aufgerufene Methode denselben Fehler ausgelöst hätte:
Zunächst wird in den umgebenden Blöcken nach einem Fehler-Handler
gesucht. Falls das erfolglos ist, wird der Fehler an den Aufrufer
weitergegeben.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Die <a href="index_t.html#ixb100347"><font color=#000080><tt>throw</tt></font></a>-Anweisung
kann nicht nur dazu verwendet werden, <i>neue</i> Fehler auszulösen.
Sie kann ebenfalls eingesetzt werden, um innerhalb der <a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Klausel
einer <a href="index_t.html#ixb100569"><font color=#000080><tt>try</tt></font></a>-<a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Anweisung
das übergebene Fehlerobjekt erneut zu senden. In diesem Fall
wird nicht noch einmal dieselbe <a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Klausel
ausgeführt, sondern der Fehler wird gemäß den oben
genannten Regeln an den umgebenden Block bzw. den Aufrufer weitergegeben.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
<tr>
<td><font color="#FFFFFF"> Tipp </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Auch selbstdefinierte Ausnahmen müssen sich an die <i>catch-or-throw</i>-Regel
halten. Wird die Ausnahme nicht innerhalb derselben Methode behandelt,
ist sie mit Hilfe der <a name="ixa100743"><a href="index_t.html#ixb100471"><font color=#000080><tt>throws</tt></font></a></a>-Klausel
im Methodenkopf zu deklarieren und weiter oben in der Aufrufkette
zu behandeln.
<p>
Das folgende Beispiel definiert eine Funktion <font color="#000077"><tt>isPrim</tt></font>,
die ermittelt, ob der übergebene Parameter eine Primzahl ist.
Wird ein negativer Wert übergeben, verursacht die Methode eine
Ausnahme des Typs <a href="index_a.html#ixb100582"><font color=#000080><tt>ArithmeticException</tt></font></a>:
<a name="listingid012009"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA">public</font> <font color="#006699">boolean</font> isPrim(<font color="#006699">int</font> n)
<font color="#555555">002 </font><font color="#0000AA">throws</font> ArithmeticException
<font color="#555555">003 </font>{
<font color="#555555">004 </font> <font color="#0000AA">if</font> (n <= 0) {
<font color="#555555">005 </font> <font color="#0000AA">throw</font> <font color="#0000AA">new</font> ArithmeticException(<font color="#0000FF">"isPrim: Parameter <= 0"</font>);
<font color="#555555">006 </font> }
<font color="#555555">007 </font> <font color="#0000AA">if</font> (n == 1) {
<font color="#555555">008 </font> <font color="#0000AA">return</font> <font color="#006699">false</font>;
<font color="#555555">009 </font> }
<font color="#555555">010 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> i = 2; i <= n/2; ++i) {
<font color="#555555">011 </font> <font color="#0000AA">if</font> (n % i == 0) {
<font color="#555555">012 </font> <font color="#0000AA">return</font> <font color="#006699">false</font>;
<font color="#555555">013 </font> }
<font color="#555555">014 </font> }
<font color="#555555">015 </font> <font color="#0000AA">return</font> <font color="#006699">true</font>;
<font color="#555555">016 </font>}</pre>
</font>
</td>
</tr>
</table>
<i>
Listing 12.9: Auslösen einer Ausnahme</i></p>
<p>
Die <a href="index_t.html#ixb100347"><font color=#000080><tt>throw</tt></font></a>-Anweisung
hat dabei den Charakter einer Sprunganweisung. Sie unterbricht das
Programm an der aktuellen Stelle und verzweigt unmittelbar zu der
umgebenden <a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Klausel.
Gibt es eine solche nicht, wird der Fehler an den Aufrufer weitergegeben.
Tritt der Fehler innerhalb einer <a href="index_t.html#ixb100569"><font color=#000080><tt>try</tt></font></a>-<a href="index_c.html#ixb100570"><font color=#000080><tt>catch</tt></font></a>-Anweisung
mit einer <a href="index_f.html#ixb100579"><font color=#000080><tt>finally</tt></font></a>-Klausel
auf, wird diese noch vor der Weitergabe des Fehlers ausgeführt.
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100078.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100080.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100082.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|