學習的第27天。
總結:
異常:
異常的覆蓋:
父類中方法聲明瞭異常,則類重寫後可不聲明。
父類中方法沒有聲明異常,則子類也不可以聲明異常。
子類可聲明更多的異常但要被 父類聲明的異常包括。
部分字節碼文件:
反編譯:javap -verbose 文件名.class > 自定義文件名.bytecode
public static int m1();
descriptor: ()I
flags: ACC_PUBLIC, ACC_STATIC
Code:
/*操作數棧 2個深度 ,局部變量表, main的參數列表 程序計數器?
stack=2, locals=4, args_size=0
/*byte in push
0: bipush 11 /*將數值 11 壓入棧頂
/*int store
2: istore_0 /*將棧頂中的int值,保存在局部變量表下標0的位置
/*將數值 22 壓入棧頂
3: bipush 22
/*將棧頂中的int值,保存在局部變量表下標0的位置
5: istore_0
/*new個異常對象,壓入棧頂
6: new #36 // class java/lang/RuntimeException
/*複製棧頂元素,並壓棧
9: dup
/*執行異常構造方法
10: invokespecial #38 // Method java/lang/RuntimeException."<init>":()V
/*將棧頂初始化完畢的異常對象進行拋出, “a” 都是對對象
13: athrow
/*將棧底的變成棧頂,再
/*將棧頂的異常對象保存在局部變量表下標1的位置
14: astore_1
/*將 33 壓入棧頂
15: bipush 33
/*將棧頂的 33 保存在局部變量表0的位置
17: istore_0
/*將局部變量表下標0的值,加載到棧頂
18: iload_0
/*將棧頂的 33 保存在局部變量表3的位置
19: istore_3
/*將 44 壓入棧頂
20: bipush 44
/*將棧頂的 44 保存在局部變量表0的位置
22: istore_0
/*將局部變量表下標 3 的值,加載到棧頂
23: iload_3
/*將棧頂的 int 數值 ,返回
24: ireturn
/* 將棧頂的 ? 存到局2
25: astore_2
26: bipush 44
/* 將棧頂的 int 存到 局0
28: istore_0
/*將 局2 加載到棧頂
29: aload_2
/* 拋出
30: athrow
Exception table:
from to target type
3 14 14 Class java/lang/Exception //從第3行到第14行
3 20 25 any //從第3行到第20行 產生了異常,從第25行開始執行
習題:
C11.10: 有如下代碼:
public class TestFinally{
public static void main(String args[]){
System.out.println( ma() );
}
public static int ma(){
int b;
//讀入b
try{
int n = 100;
return n/b;
}catch(Exception e){
return 10;
}finally{
return 100;
}
}
}
在ma中,當讀入的b爲100時, 100 ,當讀入的b爲0時,結果爲: 100
C11.5: 創建兩個自定義異常類:
要求:MyException1 爲已檢查異常,MyException2爲運行時異常。這兩個異常均具有兩個構造函數,一個無參,另一個帶字符串參數,參數表示產生異常的信息。
class MyException1 extends Exception {
public MyException1() {
}
public MyException1(String str) {
super(str);
}
}
class MyException2 extends RuntimeException {
public MyException2() {
}
public MyException2(String str) {
super(str);
}
}
C11.6: 代碼補完:
class TestMyException {
public static void main(String[] args) {
int n = 10;
// 讀入n
try {
m(n);
} catch (MyException1 ex1) {
// 輸出ex1 詳細的方法調用棧信息
ex1.printStackTrace();
} catch (MyException2 ex2) {
// 輸出ex2 的詳細信息
ex2.getMessage();
// 並把ex2 重新拋出
throw ex2;
}
}
public static void m(int n) throws MyException1 {// 聲明拋出 MyException1
if (n == 1) {
// 拋出 MyException1
// 並設定其詳細信息爲“n==1”
throw new MyException1("n==1");
} else {
// 拋出 MyException2
// 並設定其詳細信息爲“n==2”
throw new MyException2("n==2");
}
}
}
class MyException1 extends Exception {
public MyException1() {
}
public MyException1(String str) {
super(str);
}
}
class MyException2 extends RuntimeException {
public MyException2() {
}
public MyException2(String str) {
super(str);
}
}
C11.8: 有如下代碼:
class Super{
public void ma() throws IOException{}
}
interface IA{
void mb();
}
public class MySub extends Super implements IA{
public void ma()//1__{}
public void mb()//2__{}
}
在1處,填入以下_AB_代碼可以編譯通過,在2處,填入_D_代碼可以編譯通過。
A throws java.io.IOException
B throws java.io.FileNotFoundException, java.io.EOFException
C throws java.sql.SQLExecption
D 不拋