千锋逆战班,Day27

在千锋逆战学习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{}
}
发布了24 篇原创文章 · 获赞 1 · 访问量 720

猜你喜欢

转载自blog.csdn.net/weixin_46286064/article/details/104781992
今日推荐