在千锋逆战学习java的第27天
加油!
今天学习了异常中的自定义异常、方法覆盖和一个扩充知识:方法执行中字节码操作指令
自定义异常
需继承自Exception或Exception的子类,常用RuntimeException。
必要提供的构造方法:
-
无参数构造方法
-
String message参数的构造方法
异常方法覆盖
方法名、参数列表、返回值类型必须和父类相同。
子类的访问修饰符和父类相同或是比父类更宽
父类中声明了异常,子类重写后可声明也可不声明。
父类中声明了异常,子类重写可声明的异常与其相等或是其子类。
父类中方法没有声明异常,则子类也不可以声明异常。
父类中声明了异常,子类可声明比父类更多异常,必须小于其父类声明的异常。
方法执行中字节码操作指令
反编译:javap -verbose 文件名称(是.class) > 自定义文件名称.bytecode
作业题:
class MyException1 extends Exception{
public MyException1(){}
public MyException1(String message){
super(message);
}
}
class MyException2 extends RuntimeException{
public MyException2(){}
public MyException2(String message) {
super(message);
}
}
6.在上一题的基础上,把下面代码补充完整
public class TestMyException {
public static void main(String[] args) {
int n;
//读入n
try{
m(n);
}catch(MyException1 ex1){
//输出ex1详细的方法调用栈信息
}catch(MyException2 ex1){
//输出ex2的详细信息
//并把ex2重新抛出
}
}
private static void m(int n) _______{//声明抛出MyException1
if(n==1){
//抛出MyException1
//并设定其详细信息为“n==1”
}else{
//抛出MyException2
//并设定其详细信息为“n==2”
}
}
}
补充后的代码如下:
public class TestMyException {
public static void main(String[] args) {
int n;
n=1;//读入n
try{
m(n);
}catch(MyException1 ex1){
//输出ex1详细的方法调用栈信息
ex1.printStackTrace();
}catch(MyException2 ex2){
//输出ex2的详细信息
//并把ex2重新抛出
System.out.println(ex2.getMessage());
throw ex2;
}
}
private 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");
}
}
}
n=1的运行结果:
n为其他数的运行结果:
8.有如下代码
import java.io.IOException;
public 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
10.有如下代码
public class TestFinally {
public static void main(String[] args) {
System.out.println(ma());
}
public static int ma(){
int b;
b=5;//读入b
try{
int n=100;
return n/b;
}catch(Exception e){
return 10;
}finally{
return 100;
}
}
}
//在 ma 中,当读入的 b 为 100 时,输出结果为_______,
//当读入的 b 为 0 时,输出结果为______。
结果:100 100
12.有如下代码
import java.io.*;
public class MySuper {
public void m() throws IOException{}
}
class MySub extends MySuper{
public void m() throws EOFException{}
}
class MySub2 extends MySub{
public void m() throws FileNotFoundException{}
}
以上代码是否能编译通过?如果不能,应该如何修改
不能,MySub2中的m()方法不能声明比父类MySub的m()方法更宽泛的异常
修改:
//方法一,删除MySub2中的异常声明
class MySub extends MySuper{
public void m() throws EOFException{}
}
class MySub2 extends MySub{
public void m(){}
}
//方法二,MySub中增加声明FileNotFoundException
class MySub extends MySuper{
public void m() throws EOFException, FileNotFoundException{}
}
class MySub2 extends MySub{
public void m() throws FileNotFoundException{}
}
//方法三,修改MySub中的异常声明为IOException
class MySub extends MySuper{
public void m() throws IOException{}
}
class MySub2 extends MySub{
public void m() throws FileNotFoundException{}
}