Day09
1.异常
1.1 异常的继承结构
异常层次中的根节点Throwable
1.Error:目前我们编码解决不了的问题
2.Exception:通常可以通过编程解决的问题
1)编译时异常:不用运行就已经报错了,比如:少写了分号/父类对象调用子类的特有功能等等
2)运行时异常:RunTimeException编写以及保存时没有报错,但是在执行时报错了
注意:运行时异常是可以通过编译解决,不强制要求处理,方法上默认抛出RunTimeException
1.2 异常处理方案
1.捕获处理try-catch:自行解决,格式:
try{
可能出现异常的所有代码
}catch(预测出现的异常类型 异常名){
如果匹配到了我们预测的异常类型,就执行此处的异常处理方案
}
注意:我们一般不把异常直接抛出给main(),因为调用main()的是虚拟机,没人去解决了
1.3 巩固练习
package day09;
import java.util.InputMismatchException;
import java.util.Scanner;
public class TestException {
public static void main(String[] args) {
//1.调用方法,求两个整数除法的结果
//method1();//try-catch分别单独处理两个子类型异常
//method2();//try-catch使用多态,用父类型异常统一处理
//method3();//throws不处理本方法的异常,抛出到上级(谁调用谁处理)
/*main方法不能直接调用method3(),因为实际上被抛出的问题没有被解决,该报错还报错*/
f();//用来在main()调用method3()前,处理异常
}
private static void f() {
try{
method3();
}catch(Exception e){
System.out.println("数据有误!");
}
}
/*解决方案3:向上抛出异常
注意:我们一般不把异常直接抛出给main(),因为调用main()的是虚拟机,没人去解决了*/
//private static void method3() throws ArithmeticException,InputMismatchException{
private static void method3() throws Exception{
System.out.println("请输入第一个数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请输入第二个数:");
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
}
/*解决方案2:使用多态,用父类型异常Exception统一处理*/
private static void method2() {
try{
System.out.println("请输入第一个数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请输入第二个数:");
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
//不管事那种子类型异常,都可以被Exception匹配到
}catch(Exception e){
//提供通用的解决方案
System.out.println("您输入的数据有误,请重新输入!");
}
}
//ArithmeticException--算术异常
//by zero--算术异常的原因:除数为0
//InputMismatchException--输入不匹配异常:由于输入的数不是int类型
//处理输入不匹配异常需要导包
/*解决方案1:捕获处理,把可能出现的异常分别进行处理*/
private static void method1() {
try{
System.out.println("请输入第一个数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请输入第二个数:");
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
}catch(ArithmeticException e){
System.out.println("除数不能为0!");
}catch(InputMismatchException e){
System.out.println("请输入整数!");
}
}
}
2.抽象abstract
2.1 抽象类
1.被关键字abstract修饰的类是抽象类
2.一旦一个类中包含了抽象方法,那么这个类必须被声明成一个抽象类
3.抽象类中的方法不做限制,非常自由:全普/全抽/半普半抽
4.抽象类不可实例化,即不可创建对象
5.抽象类有构造方法,它自己不用,但是为了子类创建对象时调用
6.如果一个子类继承了抽象父类的,那么,有两种解决方案:
1)作为一个抽象子类:不实现/实现部分抽象父类的抽象方法,躺平
2)作为一个普通子类:实现抽象父类的全部抽象方法,还债
2.2 抽象方法
1.被关键字abstract修饰的方法就是抽象方法
2.抽象方法没有方法体{},直接以分号结束
2.3 巩固练习
package day09;
public class TestAbstract {
public static void main(String[] args) {
//4.创建子类测试
CGBTeacher c = new CGBTeacher();
// 报错:抽象类不可实例化
//ACCTTeacher a = new ACCTTeacher();
//Teacher t = new Teacher();
c.ready();
c.teach();
//5.创建多态对象测试
//编译看左边,运行看右边
Teacher t = new CGBTeacher();
t.read();//子类中没有重写,所以执行父类的功能
t.ready();
t.teach();
//t.eat();//报错:Cannot resolve method 'eat' in 'Teacher'
//多态对象不能使用子类中的特有方法
}
}
//1.定义抽象父类-老师类,并提供两种抽象方法
abstract class Teacher{
public abstract void ready();//备课
public abstract void teach();//授课
public void read(){
System.out.println("十年树木,百年树人");
}
}
//2.定义普通子类:实现父类中未实现的方法
class CGBTeacher extends Teacher{
@Override
public void ready() {
System.out.println("正在备课互联网架构与微服务框架全家桶");
}
@Override
public void teach() {
System.out.println("正在授课互联网架构与微服务框架全家桶");
}
public void eat() {
System.out.println("干饭了~");
}
}
//3.定义抽象子类:部分实现父类的方法
abstract class ACCTTeacher extends Teacher{
@Override
public void ready() {
System.out.println("正在备课基础加强与框架加强");
}
}