课前复习:
1、什么是接口?
使用interface关键字
功能的扩展
方法的聚集
一种约定
2、抽象类和接口的异同点
相同点:都是抽象的,不能被实例化
都包含抽象方法
不同点:抽象类可以有实例方法
接口的属性只能是public static final 类型
抽象类可以定义构造方法(接口不可以)
抽象类的构造方法不是给谁用的
接口不可以有静态方法,但是抽象类可以有
课堂笔记:
Throwable:所以能导致程序无法运行的根类
Error:错误:无法恢复的
Exception:异常:处理之后能正常运行的
确定会发生异常的情况:
Checked异常:确定的异常,提前处理
不确定:
Runtime异常:运行期异常,RuntimeException,遇到了再解决
常见的异常类型:
算术异常:ArithmeticException
空指针异常:NullPointException
数组越界异常:ArrayIndexOutOfBoundException
索引越界异常:IndexOutOfBoundsException
类型转换异常:ClassCastException
输入类型不匹配:InputMismatchException
输入输出异常:IOException
SQL异常:SQLException
非法参数异常:IllegalArgumentException
数字格式化异常:NumberFormatException
必须要被处理的异常:checkedException
未找到类的异常:ClassNotFoundException
异常处理:
try{
有可能发生问题的代码块;
}catch(有可能发生的异常类型 e){
对异常的查看/打印堆栈信息等操作
}finally{
必定会运行的代码
}
throw和throws:
throw:抛出,手动产生异常
必须在条件语句内
throws:声明该方法未处理的异常,必须跟在参数列表后面
RuntimeException 运行期异常的根类,遇到了才解决,不一定要处理
Exception 一定要处理
自定义异常类的过程:
继承某个已知的异常类
有参构造 super(message)调用父类的有参构造
Human
package cn.kgc.kb09;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/7/24 16:12
* @Description:
**/
public class Human {
int age;
public void setAge(int age) throws WrongAgeException {
if(age<=0){
throw new WrongAgeException("人类的年龄不可以小于0岁");
}else if(age>=120){
throw new WrongAgeException("人类的年龄不可以大于120岁");
}
this.age = age;
}
public static void main(String[] args) {
Human human = new Human();
Scanner sc=new Scanner(System.in);
System.out.println("请输入年龄:");
try {
human.setAge(sc.nextInt());
} catch (InputMismatchException e){
System.out.println("输入的类型不符合年龄");
e.printStackTrace();
}catch (WrongAgeException e) {
System.out.println("输入的年龄不是人类年龄的范围");
e.printStackTrace();
}
}
}
WrongAgeException:
package cn.kgc.kb09;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/7/24 16:33
* @Description:
**/
public class WrongAgeException extends RuntimeException {
public WrongAgeException(String message){
super(message);
}
}
Test
package cn.kgc.kb09;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/7/24 14:20
* @Description:
**/
public class Test {
public void divide(int a,int b) throws ArithmeticException{
System.out.println(a/b);//正常情况下,异常放在最后一步去处理比较好
//但是如果复用性比较高的情况下,处理掉异常,不然实际调用的时候,每个都要处理一次
}
public static void main(String[] args) {
Test t=new Test();
System.out.println("程序开始");
try {
t.divide(1, 0);
}/*catch(ArithmeticException e){
e.printStackTrace();
System.err.println("请注意有什么不一样");
//不执行的唯一情况
System.exit(1);
}*/finally {
System.out.println("这里是最终块");
//有些时候,异常可以不去处理,但是后续的步骤一定要做完
// 关闭释放资源
}
//Class.forName();
System.out.println("程序结束");
/*int a=1;
int b=0;
System.out.println("程序开始");
try {//把可能出现问题的代码放在里面
System.out.println(a / b);
}catch (ArithmeticException e) {
//System.out.println("分母为0,不合法!");
e.printStackTrace();//打印堆栈信息,把栈内存当中出现的一些情况打印出来
//由于是分成两条线在运行,所以打印的顺序并不是固定的,这两条线有个名称叫线程
System.out.println(e.getMessage());
//System.out.println(e.getCause());
}
System.out.println("程序继续运行");*/
}
}
TestReturnException:
package cn.kgc.kb09;
import java.util.Arrays;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/7/24 15:10
* @Description:
**/
public class TestReturnException {
//我声明了啥,我就抛出啥
public int[] divide(int a, int b) throws WrongAgeException{
int[] rst = {1,2};
try {
if(true){
throw new WrongAgeException("年龄不正确的异常,应该在1~100之间");
}
//只要满足其中一条就不会看其他的,和if-else类似
//rst=null;
//=赋值符,是从右边往左边运行的,先右边有值再赋值给左边
rst[3] = a / b;
//rst[1] = a / b;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
}catch (ArithmeticException e) {
return rst;
}catch (NullPointerException e){
//空指针没有办法通过捕获处理掉,空指针就是空指针,把finally rst[0] = -2 注释掉就可以了
System.out.println("空指针异常");
}/*catch(Exception e){
e.printStackTrace();
}*/
finally {
//rst[0] = -2;
}
return new int[3];
}
//main方法 throws Exception
public static void main(String[] args) {
TestReturnException testReturnException = new TestReturnException();
//testReturnException.divide(1,0);
try {
int[] str=testReturnException.divide(1,1);
} catch (WrongAgeException e) {
e.printStackTrace();
}
System.out.println("程序正常运行");
}
}