Day27-反编译:javap -verbose

学习的第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  不抛

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值