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