07异常处理
1、?【請(qǐng)嘗試解釋以下奇怪的現(xiàn)象!】
?int i=1, j=0, k;
?k=i/j;
?代碼在運(yùn)行時(shí)
會(huì)引發(fā)異常
上邊代碼在運(yùn)行時(shí)
不會(huì)引發(fā)異常
?浮點(diǎn)數(shù)除以0:Infinity
可以使用javap去反匯編兩個(gè)示例程序的.class文件(一個(gè)是AboutException.class,另一個(gè)是ThrowDemo.class),從中你會(huì)有所發(fā)現(xiàn)的。
?javac 生成 idiv字節(jié)碼指令
javac 生成ddiv字節(jié)碼指令
jvm在處理浮點(diǎn)數(shù)時(shí),生成的是ddiv字節(jié)碼指令,i/0,0轉(zhuǎn)化為浮點(diǎn)數(shù)0.0,而0.0是double類型的,并不精確,所以不會(huì)拋出異常。
jvm在處理整數(shù)時(shí),生成的是idiv字節(jié)碼指令,整數(shù)除0就是除0,會(huì)拋出異常。
JVM在具體實(shí)現(xiàn)這兩個(gè)指
令時(shí),采用了不同的處理
策略,導(dǎo)致兩段代碼運(yùn)行
時(shí)得到不同的結(jié)果
2、【動(dòng)手動(dòng)腦:多層的異常捕獲-1】
?閱讀以下代碼(CatchWho.java),寫出程序運(yùn)行結(jié)果:
運(yùn)行結(jié)果:
3、【動(dòng)手動(dòng)腦:多層的異常捕獲-2】
?寫出CatchWho2.java程序運(yùn)行的結(jié)果
運(yùn)行結(jié)果:
4、【動(dòng)手動(dòng)腦】
當(dāng)有多個(gè)嵌套的try…catch…finally時(shí),要特別注意finally的執(zhí)行時(shí)機(jī)。
請(qǐng)先閱讀 EmbedFinally.java示例,再運(yùn)行它,觀察其輸出并進(jìn)行總結(jié)。
特別注意:
當(dāng)有多層嵌套的finally時(shí),異常在不同的層次拋出?,在不同的位置拋出,可能會(huì)導(dǎo)致不同的finally語(yǔ)句塊執(zhí)行順序。
源代碼:
public class EmbededFinally {
???
?public static void main(String args[]) {
???????
??int result;
???????
??try {
???????????
???System.out.println("in Level 1");
??????????
?? ?try {
???????????????
????System.out.println("in Level 2");
? // result=100/0;? //Level 2
??????????????
?????try {
??????????????????
???? ?System.out.println("in Level 3");
?????????????????????
???? ?result=100/0;? //Level 3
???????????????
????}
???????????????
????catch (Exception e) {
???????????????????
?????System.out.println("Level 3:" + e.getClass().toString());
???????????????
????}
???????????????
???????????????
????finally {
???????????????????
?????System.out.println("In Level 3 finally");
???????????????
????}
???????????????
??????????????
????// result=100/0;? //Level 2
???????????
????}
???????????
???catch (Exception e) {
??????????????
??? ?System.out.println("Level 2:" + e.getClass().toString());
??????????
?? ?}
?? ?finally {
???????????????
????System.out.println("In Level 2 finally");
??????????
??? }
????????????
???// result = 100 / 0;? //level 1
???????
??}
???????
??catch (Exception e) {
???????????
???System.out.println("Level 1:" + e.getClass().toString());
???????
??}
???????
??finally {
??????????
.?? ?System.out.println("In Level 1 finally");
???????
??}
???
?}
}
測(cè)試結(jié)果:
?
總結(jié)try catch finally
1)try拋出一個(gè)異常之后,程序會(huì)跳出try,不再執(zhí)行try后邊的語(yǔ)句,開始對(duì)catch進(jìn)行匹配,處理異常;
2)try嵌套中,拋出的異常只有被處理才可以按順序拋出下一個(gè)異常,如果不處理,程序就終止;
3)try拋出異常之后,就跳出了try語(yǔ)句,內(nèi)層catch無(wú)法捕獲就繼續(xù)向外拋,所以外層也就有異常,外層語(yǔ)句不執(zhí)行,第二個(gè)程序 throw ?new ArithmeticExcepption沒有執(zhí)行。
4)第三個(gè)程序,try第一層第二層沒有異常不用捕獲,執(zhí)行完之后到第三層,除0有異常,catch捕獲,執(zhí)行第三層的finally然后,順序執(zhí)行第二層,第一層的finally。
總結(jié)try catch finally嵌套使用執(zhí)行順序
1)try語(yǔ)句嵌套從外層到內(nèi)層執(zhí)行,在try語(yǔ)句中,哪一層出錯(cuò),哪一層就拋出異常,后邊的try語(yǔ)句就不再執(zhí)行,如果該層存在catch就進(jìn)行相應(yīng)的捕獲,有該層的finally也執(zhí)行,除非finally遇到不執(zhí)行的情況;
2)如果該層沒有catch進(jìn)行捕獲,就向外拋出,去找catch,如果沒有catch進(jìn)行捕獲,就終止程序。
【課后作業(yè)2 動(dòng)手動(dòng)腦】
編寫一個(gè)程序,此程序在運(yùn)行時(shí)要求用戶輸入一個(gè)?整數(shù),代表某門課的考試成績(jī),程序接著給出“不及格”、“及格”、“中”、“良”、“優(yōu)”的結(jié)論。
要求程序必須具備足夠的健壯性,不管用戶輸入什?么樣的內(nèi)容,都不會(huì)崩潰。
import java.util.Scanner;
public class?Score {
public static void main(String[] args) {
// TODO Auto-generated method stub
boolean f=true,h=true,q=true;
int Sc=0;
while(f){
System.out.println("Please input a score:");
Scanner s=new Scanner(System.in);
String ss=s.nextLine();
int a=ss.length();
for(int i=0;i<a;i++){
if((ss.charAt(i)<'0')||(ss.charAt(i)>'9'))
break;
else
{
q=false;
h=false;
}
}
if(q){
try{
throw new ScException();
}
catch(ScException e){
System.out.println("格式錯(cuò)誤");
}
}
????? if(!h) //輸入的是數(shù)字
{
Sc=Integer.parseInt(ss);
if((Sc<0)||(Sc>100))
{
try{
ScException x= new ScException();
throw x;
}
catch(ScException x){
System.out.println("輸入異常,請(qǐng)輸入整數(shù)");
}
}
else
f=false;
}
}
if(Sc<60)
System.out.println("不及格");
else if(Sc<70)
System.out.println("及格");
else if(Sc<80)
System.out.println("中");
else if(Sc<90)
System.out.println("良");
else if((Sc<100)||(Sc==100))
System.out.println("優(yōu)");
}
}
class ScException extends Exception{
public ScException(){
}
}
結(jié)果截圖:
?
轉(zhuǎn)載于:https://www.cnblogs.com/DaisyYuanyq/p/7845941.html
總結(jié)
- 上一篇: c++全局监听ctrl s_号称史上最全
- 下一篇: PHP视频网站源码 带APP源代码 支持