Java異常處理語(yǔ)句及解析
一、選擇題
1.java中用來(lái)拋出異常的關(guān)鍵字是 (C)
A、tryB、catchC、throw D、finally
2.關(guān)于異常,下列說(shuō)法正確的是 (A)
A、異常是一種對(duì)象
B、一旦程序運(yùn)行,異常將被創(chuàng)建
C、為了保證程序運(yùn)行速度,要盡量避免異?刂
D、以上說(shuō)法都丌對(duì)
3.(A)類(lèi)是所有異常類(lèi)的父類(lèi)。
A、Throwable B、ErrorC、ExceptionD、AWTError
4.java語(yǔ)言中,下列哪一子句是異常處理的出口 (C)
A、try{?}子句 B、catch{?}子句
C、finally{?}子句 D、以上說(shuō)法都丌對(duì)
5.下列程序的執(zhí)行,說(shuō)法錯(cuò)誤的是 (C)
public class MultiCatch
{
public static void main(String args[])
{
try
{
int a=args.length;
int b=42/a;
int c[]={1};
c[42]=99;
System.out.println(“b=”+b);
}
catch(ArithmeticException e)
{
System.out.println(“除0異常:”+e);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println(“數(shù)組超越邊界異常:”+e);
}
}
}
A、程序?qū)⑤敵龅?5行的異常信息
B、程序第10行出錯(cuò)
C、程序?qū)⑤敵觥癰=42”
D、程序?qū)⑤敵龅?5和19行的異常信息
6.下列程序的執(zhí)行,說(shuō)法正確的是 (D)
class ExMulti
{
static void procedure()
{
try
{
int c[]={1};
c[42]=99;
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(“數(shù)組超越界限異常:”+e);
}
}
public static void main(String args[])
{
try
{
procedure();
int a=args.length;
int b=42/a;
System.out.println(“b=”+b);
}
catch(ArithmeticException e)
{
System.out.println(“除0異常:”+e);
}
}
}
A、程序只輸出第12行的異常信息
B、程序只輸出第26行的異常信息
C、程序?qū)⒉惠敵霎惓P畔?/p>
D、程序?qū)⑤敵龅?2行和第26行的異常信息
7.下面程序拋出了一個(gè)“異常”并捕捉它。請(qǐng)?jiān)跈M線處填入適當(dāng)內(nèi)容完成程序。 class TrowsDemo
{
static void procedure() throws IllegalAccessExcepton
{
System.out.println(“inside procedure”);
throw_IllegalAccessException(“demo”);
}
public static void main(String args[])
{
try
{
procedure();
}
{
System.out.println(“捕獲:”+e);
}
}
8.對(duì)于catch子句的排列,下列哪種是正確的(B )
A、父類(lèi)在先,子類(lèi)在后
B、子類(lèi)在先,父類(lèi)在后
C、有繼承關(guān)系的異常不能在同一個(gè)try程序段內(nèi)
D、先有子類(lèi),其他如何排列都無(wú)關(guān)
9.在異常處理中,如釋放資源、關(guān)閉文件、關(guān)閉數(shù)據(jù)庫(kù)等由(C )來(lái)完成。
A、try子句 B、catch子句
C、finally子句D、throw子句
10.當(dāng)方法遇到異常又不知如何處理時(shí),下列哪種說(shuō)法是正確的(C )
A、捕獲異常 B、拋出異常
C、聲明異常 D、嵌套異常
11.哪個(gè)關(guān)鍵字可以拋出異常? (C)
A、transientB、 finallyC、 throw D、 static
12.一個(gè)異常將終止( A)
A、整個(gè)程序 B、叧終止拋出異常的方法
C、產(chǎn)生異常的try塊 D、×上面的說(shuō)法都丌對(duì)
二、填空題 Java異常處理 內(nèi)部資料【機(jī)密】 交流QQ 250586262
1、catch子句都帶一個(gè)參數(shù),該參數(shù)是某個(gè)異常的類(lèi)及其變量名,catch用該參數(shù)去與 __出現(xiàn)異常_____對(duì)象的類(lèi)進(jìn)行匹配。
2、java虛擬機(jī)能自動(dòng)處理__運(yùn)行異常_____異常。
3、變量屬性是描述變量的作用域,按作用域分類(lèi),變量有局部變量、類(lèi)變量、方法參 數(shù)和_______
4、捕獲異常要求在程序的方法中預(yù)先聲明,在調(diào)用方法時(shí)用try-catch-_finally_____語(yǔ)句捕 獲并處理。
5、java語(yǔ)言認(rèn)為那些可預(yù)料和不可預(yù)料的'出錯(cuò)稱(chēng)為_(kāi)___異常_____
6、按異常處理不同可以分為運(yùn)行異常、捕獲異常、聲明異常和_拋出異常_____幾種。
7、拋出異常的程序代碼可以是_自定義的異常_____或者是JDK中的某個(gè)類(lèi),還可以是JVM.
8、拋出異常、生成異常對(duì)象都可以通過(guò)__throws_______語(yǔ)句實(shí)現(xiàn)。
9、捕獲異常的統(tǒng)一出口通過(guò)___finally______語(yǔ)句實(shí)現(xiàn)。
10、java語(yǔ)言的類(lèi)庫(kù)中提供了一個(gè)___Throwable_______類(lèi),所有的異常都必須是它的實(shí)例
或它
子類(lèi)的實(shí)例。
11、Throwable類(lèi)有兩個(gè)子類(lèi):RunException___類(lèi)和Exception類(lèi)。
12、對(duì)程序語(yǔ)言而言,一般有編譯錯(cuò)誤和__運(yùn)行____錯(cuò)誤兩類(lèi)。
13、下面程序定義了一個(gè)字符串?dāng)?shù)組,并打印輸出,捕獲數(shù)組超越界限異常。請(qǐng)?jiān)跈M 線處填入適當(dāng)?shù)膬?nèi)容完成程序。
public class HelloWorld
{
int i=0;
String greetings[]={
“Hello world!”,
“No,I mean it!”,
“HELLO WORLD!!”
};
while(i<4)
{
____try________
{
System.out.println(greeting[i]);
}
____catch__(ArrayIndexOutOfBoundsException e)
{
System.out.println(“Re-setting Index Value”);
i=-1;}
finally
{
System.out.println(“This is always printed”);
}
i++;
}
}
三、判斷題
1. ( F ) 程序中拋出異常時(shí)(throw ?),只能拋出自己定義的異常對(duì)象。
2. ( T ) 一個(gè)異常處理中 finally語(yǔ)句塊只能有一個(gè)或者可以沒(méi)有。
3.( T )異常類(lèi)對(duì)象代表當(dāng)前出現(xiàn)的一個(gè)具體異常。
4.( T )java語(yǔ)言中的所有異常類(lèi)都是java.lang.Throwable的子類(lèi)。
5.( F ) 如果異常發(fā)生時(shí),沒(méi)有捕獲異常的代碼,程序會(huì)正常執(zhí)行。
四、編程題
1.參考下面的程序,試修改程序,捕獲相關(guān)異常,使得程序能正常運(yùn)行。[提示:用 錯(cuò)誤數(shù)據(jù)測(cè)試,即可得到異常類(lèi)名,運(yùn)行時(shí)主方法參數(shù)輸入 abc 測(cè)試]
public class StringIndexOutOf
{
public static void main(String args[])
{
System.out.println("字符串索引越界異常");
String str=args[0];
System.out.println(“第四個(gè)字符為 ”+str.charAt(3));
int aa=Integer.parseInt(args[0]); System.out.println(“平方為 ”+aa*aa);
}
}
2. 從命令行得到5個(gè)整數(shù),放入一整型數(shù)組,然后打印輸出,要求:如果輸入數(shù)據(jù) 丌為整數(shù),要捕獲Integer.parseInt()產(chǎn)生的異常,顯示“請(qǐng)輸入整數(shù)”,捕獲輸入?yún)?數(shù)丌足5個(gè)的異常(數(shù)組越界),顯示“請(qǐng)輸入至少5個(gè)整數(shù)”。
3.寫(xiě)一個(gè)方法void sanjiao(int a,int b,int c),判斷三個(gè)參數(shù)是否能構(gòu)成一個(gè)三角形, 如果丌能則拋出異常IllegalArgumentException,顯示異常信息a,b,c+”丌能構(gòu)成三角 形”,如果可以構(gòu)成則顯示三角形三個(gè)邊長(zhǎng),在主方法中得到命令行輸入的三個(gè)整數(shù), 調(diào)用此方法,并捕獲異常。
4.自定義類(lèi)Sanj,其中有成員 x,y,z,作為三邊長(zhǎng),構(gòu)造方法Sanj(a,b,c)分別給x,y,z 賦值,方法求面積getArea和顯示三角形信息(三個(gè)邊長(zhǎng))showInfo,這2個(gè)方法中當(dāng)三 條邊丌能構(gòu)成一個(gè)三角形時(shí)要拋出自定義異常NotSanjiaoException,否則顯示正確信 息。在另外一個(gè)類(lèi)中的主方法中構(gòu)造一個(gè)Sanj對(duì)象(三邊為命令行輸入的三個(gè)整數(shù)), 顯示三角形信息和面積,要求捕獲異常。
篇二:Java中異常處理
第13章 異常課堂練習(xí)(2理論+2習(xí)題課+2上機(jī))
【教學(xué)目標(biāo)】
?
?
? 了解異常和異常處理的概貌(第13.2節(jié))。 探究使用異常處理的優(yōu)點(diǎn)(第13.3節(jié))。 區(qū)別異常的類(lèi)型: 致命的) 和 非致命的), 以及必檢和免檢異常(第13.4
節(jié))。
?
?
?
?
?
?
?
?
? 在方法頭中聲明異常(第13.5.1節(jié))。 在方法中拋出異常(第13.5.2節(jié))。 編寫(xiě)塊處理異常(第13.5.3節(jié))。 解釋異常是如何傳播的(第13.5.3節(jié))。 在塊中使用子句(第13.6節(jié))。 只為非預(yù)期錯(cuò)誤使用異常(第13.7節(jié))。 在塊中重新拋出異常(第13.8節(jié))。 創(chuàng)建鏈?zhǔn)疆惓#ǖ?3.9節(jié))。 定義自定制的異常類(lèi)(第13.10節(jié))。
【教學(xué)重點(diǎn)】
?
?
?
? 了解異常的處理機(jī)制 異常的解決方法 Exception類(lèi)的作用及其使用方法 必檢異常、免檢異常的特點(diǎn)
【基本知識(shí)點(diǎn)】
1、常見(jiàn)異常演示
。1)算數(shù)異常:java.lang.ArithmeticException
在算術(shù)運(yùn)算中,0作為除數(shù)時(shí),系統(tǒng)將產(chǎn)生該異常,示例:
public static void main(String[] args) {
} int x=10; int y=0; int m=x/y;
Exception in thread "main" java.lang.ArithmeticException: / by zero at exception.NotChecketException.main(NotChecketException.java:7)
。2)數(shù)組越界異常:java.lang.ArrayIndexOutOfBoundsException
在數(shù)組下標(biāo)越界時(shí),將產(chǎn)生該異常,示例:
public static void main(String[] args) {
} int arr[]={1,2,3}; System.out.println(arr[3]);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at exception.NotChecketException.main(NotChecketException.java:6)
。3)數(shù)組存儲(chǔ)異常:java.lang.ArrayStoreException
在數(shù)組中存入與之聲明類(lèi)型不符的類(lèi)型,將產(chǎn)生該異常,示例:
public static void main(String[] args) {
} boolean[] b = {false,true,false}; int attr[] = {1,2,3}; System.arraycopy(attr, 0, b, 0, 1);
Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method) at exception.NotChecketException.main(NotChecketException.java:7)
。4)對(duì)象轉(zhuǎn)換異常:java.lang.ClassCastException
將對(duì)象A轉(zhuǎn)換成為對(duì)象B時(shí),如果A既不是與B同一個(gè)類(lèi),也不是B的子類(lèi),將產(chǎn)生該異常,示例:
public static void main(String[] args) {
} Object obj = new Object(); int in[] = (int[]) obj;
Exception in thread "main" java.lang.ClassCastException:
java.lang.Object cannot be cast to [I
at exception.NotChecketException.main(NotChecketException.java:6)
(5)空指針異常:java.lang.NullPointerException
引用空對(duì)象的實(shí)例或方法時(shí),將產(chǎn)生該異常。示例:
public static void main(String[] args) {
} String str = null; System.out.println(str.length());
Exception in thread "main" java.lang.NullPointerException
at exception.NotChecketException.main(NotChecketException.java:6)
2、try…catch語(yǔ)句捕獲異常
public class ExceptionDemo1 {
}
public static void main(String[] args) {} int i[] = { 1, 2, 3 }; try {System.out.println("i[0]=" + i[0]); System.out.println("i[3]=" + i[3]); } catch (ArrayIndexOutOfBoundsException e) { } System.out.println("i[1]=" + i[1]); System.out.println("出現(xiàn)異常" + e.getMessage());
以上面的程序運(yùn)行結(jié)果可以發(fā)現(xiàn),在程序中加入異常處理代碼后,當(dāng)異常發(fā)生時(shí),整個(gè)程序沒(méi)有因?yàn)楫惓5某霈F(xiàn)而中斷執(zhí)行。
3、try…catch…finally語(yǔ)句捕獲異常
public class ExceptionDemo4 {
public static void main(String[] args) {int i[] = { 1, 2, 3 }; try {System.out.println("i[0]=" + i[0]); System.out.println("i[3]=" + i[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("出現(xiàn)異常" + e.getMessage()); }finally{ System.out.println("......無(wú)論是否有異常,都會(huì)執(zhí)行finally語(yǔ)句......");
} System.out.println("i[1]=" + i[1]);
}
}
其中,不論try代碼塊中發(fā)生了哪種異常,也不論try代碼塊和catch代碼塊是否可以正常執(zhí)行,finally代碼塊都保證會(huì)執(zhí)行。即使前面的try…catch代碼塊都無(wú)法捕獲這個(gè)異常,或者在catch代碼塊中還有其他異常產(chǎn)生,在將新的異常傳遞給java運(yùn)行時(shí)環(huán)境之前都會(huì)先執(zhí)行finally代碼塊。
4、多個(gè)catch代碼塊
public class ExceptionDemo5 {
} public static void main(String[] args) { } FileReader fr = null; try {fr=new FileReader("test.txt"); fr.read(); } catch (FileNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace(); }finally{ } try { fr.close(); } catch (IOException e) {} // TODO Auto-generated catch block e.printStackTrace();
使用多個(gè)catch語(yǔ)句塊的時(shí)候,請(qǐng)注意catch代碼塊的排順序問(wèn)題。Catch代碼塊捕獲異常是按照順序的,如果前面已經(jīng)有一個(gè)異常類(lèi)型被捕獲了,但又同時(shí)滿(mǎn)足后面的異常類(lèi)型時(shí),就不會(huì)被捕獲了。
5、在調(diào)用方法出處理被拋出的異常
public class Exception6 {
}
在上面的程序中,“不存在的文檔”表示在同一個(gè)目錄下沒(méi)有該文檔。當(dāng)arrException()方法產(chǎn)生了異常,此方法并不作處理,而是交由調(diào)用arrException()方法的main方法處理。 public static void arrException() throws IOException{} public static void main(String[] args) { } try { arrException(); FileReader fr = new FileReader("不存在的文檔.txt"); fr.close(); } catch (IOException e) {} // TODO Auto-generated catch block e.printStackTrace();
6、錯(cuò)誤的使用
throws
篇三:java中異常處理中return的用法
java中異常處理中return的用法 關(guān)于try、catch、finally語(yǔ)句塊中含有return語(yǔ)句的幾點(diǎn)說(shuō)明:
1、第一種情況:try塊有return語(yǔ)句,catch塊沒(méi)有return,函數(shù)末尾也沒(méi)有return:
看代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
test(num);
}
public static int test(int b){
try{
b += 10;
return b;
}catch(Exception e){
}finally{
}
}
}
編譯結(jié)果:
H:java Demo>javac Demo.java
Demo.java:18: 缺少返回語(yǔ)句
}
^
1 錯(cuò)誤
有人可能會(huì)說(shuō),我在try塊中不是有return語(yǔ)句嗎?為什么會(huì)提示缺少return語(yǔ)句呢?這是因?yàn)榫幾g器認(rèn)為try塊中是又可能產(chǎn)生異常操作
的,也就是說(shuō)在return語(yǔ)句之前如果出現(xiàn)異常的話,那么return語(yǔ)句根本沒(méi)有機(jī)會(huì)得到執(zhí)行,所以編譯器會(huì)認(rèn)為缺少return語(yǔ)句。
解決辦法:a、在catch塊中加入return語(yǔ)句,因?yàn)橐坏┏霈F(xiàn)異常,catch中的語(yǔ)句可以保證函數(shù)會(huì)有一個(gè)返回值
b、在finally塊中加入return語(yǔ)句,同樣只要系統(tǒng)不退出,finally語(yǔ)句塊會(huì)始終得到執(zhí)行的
代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(Exception e){
}finally{ return 0;
}
}
}
c、在函數(shù)末尾加入return語(yǔ)句
代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){ try{
b += 10;
return b;
}catch(Exception e){
}finally{
}
return 0;
}
}
2、第二種情況,看代碼:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
}
return 0;
}
}
結(jié)果:H:java Demo>javac Demo.java
Demo.java:8: "try" 不帶有 "catch" 或 "finally"
try{
^
1 錯(cuò)誤
說(shuō)明:也就是說(shuō),如果有try語(yǔ)句的話,可以有catch語(yǔ)句,沒(méi)有finally語(yǔ)句,但是如果沒(méi)有catch語(yǔ)句的話,那么一定要有finally語(yǔ)句
。并且如果出現(xiàn)catch語(yǔ)句的話,catch語(yǔ)句可以出現(xiàn)多次,而finally語(yǔ)句只能出現(xiàn)一次。
代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){ try{
b += 10;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
}
return 0;
}
}
3、第三種情況:
a、try塊中有return語(yǔ)句,那么是先執(zhí)行return語(yǔ)句,還是先執(zhí)行finally語(yǔ)句。大家通常會(huì)有一個(gè)錯(cuò)誤的認(rèn)識(shí),可能有的老師都會(huì)講錯(cuò)
,認(rèn)為是先執(zhí)行finally語(yǔ)句,再執(zhí)行return語(yǔ)句,但是這是錯(cuò)誤的,事實(shí)上是先執(zhí)行return語(yǔ)句,再執(zhí)行finally語(yǔ)句,然后將結(jié)果返回,也可以說(shuō)return語(yǔ)句執(zhí)行了兩次,一次在finally之前,一次在finally之后,但是返回的確是第一次執(zhí)行的值
,如果有不信的,請(qǐng)繼續(xù)看代碼,此段代碼可以證明我的觀點(diǎn):
代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){ }finally{
b += 10;
}
return 0;
}
}
結(jié)果:
H:java Demo>javac Demo.java
H:java Demo>java Demo 20
說(shuō)明:此處需要引入緩沖的概念,有對(duì)緩沖不太了解的也沒(méi)關(guān)系,程序運(yùn)行結(jié)果是20足以證明我的觀點(diǎn),程序執(zhí)行流程是進(jìn)入try語(yǔ)句塊
執(zhí)行return語(yǔ)句,但是程序有finally語(yǔ)句塊,所有先將return返回的值緩沖起來(lái),然后程序跳轉(zhuǎn)到finally語(yǔ)句塊執(zhí)行,我在finally語(yǔ)
句塊中修改了變量b的值,但是程序返回的依然是20,并不是30,說(shuō)明finally語(yǔ)句塊執(zhí)行完畢后,程序直接將之前緩沖的值返回了。所以
這就是真實(shí)的執(zhí)行流程。
b、try塊中有return,finally語(yǔ)句塊中也有return,此時(shí)的情況是什么樣呢? 看代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
b += 10;
return b;
}
} }
結(jié)果是:
H:java Demo>java Demo
30
說(shuō)明:為什么此時(shí)結(jié)果是30了呢,大家都知道return語(yǔ)句的作用是結(jié)束程序體,所以此段代碼依然是先執(zhí)行try塊中的return語(yǔ)句,并將20
緩存起來(lái),接著跳轉(zhuǎn)到finally語(yǔ)句塊執(zhí)行,但是由于finally語(yǔ)句塊中有return語(yǔ)句,所以程序在此處結(jié)束,并不返回到try塊中返回結(jié)
果,而是直接將finally塊中新修改的值即30,返回。
c、try塊中有return語(yǔ)句,catch塊中也有return語(yǔ)句,這時(shí)候是最簡(jiǎn)單的一種情況:
看代碼:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
int a = b/0;
return b;
}catch(Exception e2){
b += 10;
return b;
}
}
}
結(jié)果:
H:java Demo>java Demo
20
說(shuō)明:我在try塊中觸發(fā)了一個(gè)異常,程序跳入catch語(yǔ)句塊,try語(yǔ)句塊中剩
【Java異常處理語(yǔ)句及解析】相關(guān)文章: