Day27

學習的第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  不拋

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章