Skip to content

Commit 20058b8

Browse files
committed
updated
1 parent 33437ee commit 20058b8

9 files changed

+742
-21
lines changed

build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apply plugin: 'java'
2+
apply plugin: 'groovy'
3+
4+
repositories {
5+
mavenCentral()
6+
}
7+
8+
dependencies {
9+
groovy 'org.codehaus.groovy:groovy-all:1.8.5'
10+
testCompile 'org.spockframework:spock-core:0.5-groovy-1.8'
11+
}

cook/project.epub

93.5 KB
Binary file not shown.

cook/project.pdf

197 KB
Binary file not shown.

index.rst

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,29 @@
22
@project: JavaSteps
33
@title: Java Steps
44
@authors: 2011, 董少桓、林彥宏
5-
@version: 1.0
6-
@release: 1.0
75
@latex_logo: img/logo.eps
8-
9-
**********
6+
7+
##########
108
Java Steps
11-
**********
9+
##########
1210

1311
.. toctree::
1412
:maxdepth: 3
1513

1614
java_intro
15+
16+
.. remain
1717
java_basis
1818
java_vartype
1919
java_stdio
2020
java_expr
2121
java_static
2222
java_cond
2323
java_loop
24+
java_array
2425
java_object
2526
java_encap
2627
java_abstract
2728
java_interface
29+
java_generic
30+
java_exception

java_exception.rst

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
例外狀態的處理
2+
============
3+
4+
一個程式在執行時,可能會有許多不正常或例外的狀態需要處理。
5+
例如:網路突然斷線、插入了錯誤的光碟、使用 0 為除數或陣列的 index 值超出了範圍等等。
6+
為了讓處理這些例外狀況的程式碼與主程式不混在一起,
7+
Java 使用 了try、catch 將主程式與處理例外狀況的程式碼分開。
8+
9+
.. code-block:: java
10+
11+
try {
12+
// ... 程式的主要邏輯在此,
13+
// ... 執行時可能會產生IO Exception
14+
} catch (IOException e) {
15+
// 處理IO Exception的程式碼,例如:
16+
e.printStackTrace();
17+
System.out.println(e);
18+
// ...
19+
}
20+
21+
為了能區分不同種類的 Exception,
22+
Java 也將 Exception 以繼承的方式分類。
23+
例如以下的三個 Exception 類別: ::
24+
25+
Exception
26+
|
27+
V
28+
IOException
29+
|
30+
V
31+
FileNotFoundException
32+
33+
其中 Exception 涵蓋所有的 Exception,
34+
而 FileNotFoundException 則指定 file not found 這種狀況。
35+
36+
try 之後,可以 catch 許多的例外。例如:
37+
38+
.. code-block:: java
39+
40+
try {
41+
// ...
42+
// ...
43+
} catch (FileNotFoundException e) {
44+
System.out.println("檔案不存在");
45+
} catch (IOException e) {
46+
System.out.println("發生輸出入錯誤");
47+
}
48+
49+
然而,catch 的出現的次序必須與各個 exception 類別的繼承次序配合。
50+
繼承層次低的類別要先出現,繼承層次高的後出現。
51+
例如:以下這個錯誤的寫法:
52+
53+
.. code-block:: java
54+
55+
try {
56+
// ...
57+
// ...
58+
} catch (IOException e) {
59+
System.out.println("發生輸出入錯誤");
60+
} catch (FileNotFoundException e) {
61+
System.out.println("檔案不存在");
62+
}
63+
64+
System.out.println("檔案不存在") 便不可能被執行到,因為 FileNotFoundException 也是 IOException 的一種。所以會先被IOException 抓到。
65+
66+
以下是一個讀取輸入資料檔的範例:
67+
68+
.. code-block:: java
69+
70+
import java.io.*;
71+
import java.util.*;
72+
73+
public class ReadFile {
74+
public static void main(String args[]) {
75+
try {
76+
FileInputStream stream = new FileInputStream("xx.part");
77+
InputStreamReader reader = new InputStreamReader(stream);
78+
BufferedReader breader = new BufferedReader(reader);
79+
String record;
80+
String nameString;
81+
int grade;
82+
while ((record = breader.readLine()) != null) {
83+
StringTokenizer tokens = new StringTokenizer(record);
84+
nameString = tokens.nextToken();
85+
grade = Integer.parseInt(tokens.nextToken());
86+
System.out.println(nameString + " " + grade);
87+
}
88+
stream.close();
89+
}
90+
catch (FileNotFoundException e) {
91+
System.out.println(e);
92+
} catch (IOException e) {
93+
System.out.println(e);
94+
}
95+
}
96+
}
97+
98+
由以上的範例可以看出,try 與 catch 之間是程式的正常邏輯。
99+
當在讀取檔案時發生例外時,
100+
程式的執行則自動的跳到 catch 中執行。
101+
至於是跳到那個 catch,
102+
則要看是 FileNotFoundException 還是其他的 IOException 而定。
103+
104+
以下則是一個將 while 放在 try、catch 之外
105+
並且利用一個 tryAgain 的變數讓一個程式可以不斷的請使用者放入磁片,
106+
直到放正確才繼續處理的程式。
107+
108+
import java.io.*;
109+
import java.util.*;
110+
111+
public class ReadData {
112+
public static void readFile(String fileName) {
113+
boolean tryAgain = true;
114+
while (tryAgain) {
115+
try {
116+
tryAgain = false;
117+
//
118+
// 讀檔成功之後的程式碼
119+
//
120+
}
121+
catch (FileNotFoundException e) {
122+
tryAgain = true;
123+
}
124+
catch (IOException e) {
125+
System.out.println(e);
126+
}
127+
}
128+
}
129+
}
130+
131+
其他常見的 Exception 類別還有:
132+
ArrayIndexOutOfBoundsException, ArithmeticException 等。
133+
當 Exception 發生時,也可以使用 System.exit(0) 結束程式的執行。
134+
例如:
135+
136+
.. code-block:: java
137+
138+
catch (IOException e) {
139+
System.exit(0);
140+
}
141+
142+
除了 try, catch 外,finaly 子句是用來寫在例外或沒有例外發生時都需要執行的程式碼。
143+
其語法如下:
144+
145+
.. code-block:: java
146+
147+
try {
148+
// ...
149+
}
150+
catch (exception-class name e) {
151+
// ...
152+
}
153+
finally {
154+
// ...
155+
}
156+
157+
除了使用 Java 內建的數個 Exception 類別。
158+
程式設計師也可以依據程式的需要,
159+
自行定義 Exception 的子類別:
160+
161+
.. code-block:: java
162+
163+
public class StrangeDataException extends Exception {
164+
}
165+
166+
以上的 StrangeDataException 是一個 Exception 的子類別。
167+
定義好之後,便可以在 try 子句內使用 new 與 throw 來產生一個 exception:
168+
169+
.. code-block:: java
170+
171+
try {
172+
// ...
173+
if (...) { // someting-wrong
174+
throw (new StrangeDataException()) ;
175+
} else {
176+
... // 正常處理
177+
}
178+
}
179+
catch (StrangeDataException e) {
180+
// e 是一個 StrangeDataException 的物件
181+
//
182+
// 處理 StrangeDataException 發生時的程式碼
183+
//
184+
}
185+
186+
以下這個範例則是在產生 StrangeDataException 物件時
187+
透過有參數的 constructor 將例外處理時所需要的資料傳入的範例:
188+
189+
.. code-block:: java
190+
191+
// ...
192+
public class StrangeDataException extends Exception {
193+
// 某個類別 obj;
194+
StrangeDataException(某個類別 o, ...) {
195+
obj = o;
196+
}
197+
handleStrangeData(...){
198+
// ...
199+
}
200+
}
201+
202+
// ...
203+
204+
try {
205+
// ...
206+
if (...) { // someting-wrong
207+
throw (new StrangeDataException(objx, ...)) ;
208+
} else {
209+
// ... 正常處理
210+
}
211+
}
212+
catch (StrangeDataException e) {
213+
// e 是一個StrangeDataException的物件
214+
// ...
215+
// 呼叫發生 StrangeDataException 的處理方法
216+
e.handleStrangeData(...
217+
// ...
218+
}

0 commit comments

Comments
 (0)