07异常处理
1、?【請嘗試解釋以下奇怪的現象!】
?int i=1, j=0, k;
?k=i/j;
?代碼在運行時
會引發異常
上邊代碼在運行時
不會引發異常
?浮點數除以0:Infinity
可以使用javap去反匯編兩個示例程序的.class文件(一個是AboutException.class,另一個是ThrowDemo.class),從中你會有所發現的。
?javac 生成 idiv字節碼指令
javac 生成ddiv字節碼指令
jvm在處理浮點數時,生成的是ddiv字節碼指令,i/0,0轉化為浮點數0.0,而0.0是double類型的,并不精確,所以不會拋出異常。
jvm在處理整數時,生成的是idiv字節碼指令,整數除0就是除0,會拋出異常。
JVM在具體實現這兩個指
令時,采用了不同的處理
策略,導致兩段代碼運行
時得到不同的結果
2、【動手動腦:多層的異常捕獲-1】
?閱讀以下代碼(CatchWho.java),寫出程序運行結果:
運行結果:
3、【動手動腦:多層的異常捕獲-2】
?寫出CatchWho2.java程序運行的結果
運行結果:
4、【動手動腦】
當有多個嵌套的try…catch…finally時,要特別注意finally的執行時機。
請先閱讀 EmbedFinally.java示例,再運行它,觀察其輸出并進行總結。
特別注意:
當有多層嵌套的finally時,異常在不同的層次拋出?,在不同的位置拋出,可能會導致不同的finally語句塊執行順序。
源代碼:
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");
???????
??}
???
?}
}
測試結果:
?
總結try catch finally
1)try拋出一個異常之后,程序會跳出try,不再執行try后邊的語句,開始對catch進行匹配,處理異常;
2)try嵌套中,拋出的異常只有被處理才可以按順序拋出下一個異常,如果不處理,程序就終止;
3)try拋出異常之后,就跳出了try語句,內層catch無法捕獲就繼續向外拋,所以外層也就有異常,外層語句不執行,第二個程序 throw ?new ArithmeticExcepption沒有執行。
4)第三個程序,try第一層第二層沒有異常不用捕獲,執行完之后到第三層,除0有異常,catch捕獲,執行第三層的finally然后,順序執行第二層,第一層的finally。
總結try catch finally嵌套使用執行順序
1)try語句嵌套從外層到內層執行,在try語句中,哪一層出錯,哪一層就拋出異常,后邊的try語句就不再執行,如果該層存在catch就進行相應的捕獲,有該層的finally也執行,除非finally遇到不執行的情況;
2)如果該層沒有catch進行捕獲,就向外拋出,去找catch,如果沒有catch進行捕獲,就終止程序。
【課后作業2 動手動腦】
編寫一個程序,此程序在運行時要求用戶輸入一個?整數,代表某門課的考試成績,程序接著給出“不及格”、“及格”、“中”、“良”、“優”的結論。
要求程序必須具備足夠的健壯性,不管用戶輸入什?么樣的內容,都不會崩潰。
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("格式錯誤");
}
}
????? if(!h) //輸入的是數字
{
Sc=Integer.parseInt(ss);
if((Sc<0)||(Sc>100))
{
try{
ScException x= new ScException();
throw x;
}
catch(ScException x){
System.out.println("輸入異常,請輸入整數");
}
}
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("優");
}
}
class ScException extends Exception{
public ScException(){
}
}
結果截圖:
?
轉載于:https://www.cnblogs.com/DaisyYuanyq/p/7845941.html
總結
- 上一篇: c++全局监听ctrl s_号称史上最全
- 下一篇: 代码 拉取_Git 利用 Webhook