1.异常
程序在运行过程中遇到了特殊情况使程序意外中断,不再执行叫异常.
2.异常的根类java.lang.Throwable,它的下面两个子类
2.1:java.lang.Error
由于JVM底层出问题面导致的异常,开发人员无法解决.
2.2:java.lang.Exception
由于程序设计不合理或者是偶然的外界因素导致的异常.
2.2.1:运行时异常
由于程序设计不合理而导至的异常.
常见运行时异常有:空指针异常、类型转换异常、算术异常、数组越界异常....
2.2.2:检查异常(非运行时异常)
由于偶然的外界因素导致的异常,这类异常的作用就是提醒调用者用这个方法可以可能会出现某种异常,但是不一定发生.
检查异常一般是在代码写完后报一条红色横线.
3.异常处理机制
将出现异常的代码进行处理.
3.1 捕获异常:
- 适用场景:适用于任何出异常的地方.
- 语法:
-
try{ 可能会出异常的代码块; }catch(异常类型1 参数1){ 出异常后会执行的代码; }catch(异常类型2|异常类型3 参数1){ 出异常后会执行的代码; }finally{ 一般情况下一定会执行代码;(释放资源) }
- 语法特点:
- 在try-catch-finally块中,try块有且仅有一个,用来写可能会出异常的代 码块.
- 在try-catch-finally块中,catch块可以有0个到多个;
如果有多个catch块,catch块中异常由小异常类型写到大异常类型.
一个catch块中异常类型可以写多个,多个异常类型间用|分隔.
catch块可以执行0次到1次.
- 在try-catch-finally块中,finally块可以0个到1个.
finally块无论如何都要执行代码,除非遇到System.exit()就不执行.
finally块优先级高于return.
public static void main(String[] args) {
try {
System.out.println(11);
//int num=8/0;
System.out.println(22);
return;//finally优先级高于return.
//System.exit(0);
}catch (ArithmeticException|NullPointerException e2) {
System.out.println("算术异常");
} catch (Exception e) {
System.out.println("出异常了");
}finally {
System.out.println("这是一个finally块");
}
}
public static void main(String[] args) {
//声明一个变量作标记,标记是否输入正确
boolean flag=true;
do {
flag=true;
try {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数:");
int num=input.nextInt();
} catch (Exception e) {
System.out.println("你的输入有误,请继续输入");
flag=false;
}
}while(flag==false);
}
//让出异常的代码回归正轨
public static void main(String[] args) {
//声明一个变量作标记,标记是否输入正确
boolean flag=true;
do {
flag=true;
try {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数:");
int num=input.nextInt();
} catch (Exception e) {
System.out.println("你的输入有误,请继续输入");
flag=false;
}
}while(flag==false);
}
3.2:抛出异常类型
throws.在方法声明的时候抛出异常类型.
- 适用于:检查异常.
- 作用:提醒调用者
- 语法:
public 返回值类型 方法名(形参列表)throws 异常类型1,异常类型1{
}
public static void main(String[] args) throws Exception{
//创建日期格式化对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//将字符串转换为指定格式日期,有风险,字符串符合格式化对象内设置格式才能转换为日期
Date d2=sdf.parse("2020年01月01日 11:11:11");
System.out.println(d2);
}
3.3:抛出异常对象
throw.在方法中抛出异常对象
- 适用于:适用写底层代码时,防止上层调用都来乱用方法而抛出异常对象.
- 作用:提醒上层调用者
- 语法:
public 返回值类型 方法名(形参列表)throws 异常类型1,异常类型1{
......
throw new 异常类型();
.....
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
3.4:throws VS throw:
- throws抛出的是1个到多个异常类型;throw抛出的是一个异常对象.
- throws一般抛出的是检查异常;throw用于底层代码对上层调用限制.
- throws在是方法声明的小括号后面使用;throw在方法体中使用.
4.异常的传递
按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认处理.
5.异常在方法重写中一定要注意:子类中的方法,不能抛出比父类更多,更宽的异常.
6.自定义异常类:
- 适用场景:当Jdk底层的异常类型无法满足用户的需求,这时我们就要自定义异常.
- 语法:
public class 自定义异常类名 extends jdk中任意一个异常类{
public 自定义异常类名(String mess){
super(mess);
}
}
/**
* 自定义异常类
*/
public class MyException extends Exception{
//重写构造方法
public MyException(String mess) {
super(mess);
}
}
public class ThrowTest1 {
public static void main(String[] args) throws MyException {
show();
}
public static void show() throws MyException {
Scanner input=new Scanner(System.in);
System.out.println("请输入整数1-7:");
int num=input.nextInt();
if (num>=1&&num<=7) {
System.out.println("当前数为:"+num);
}else {
throw new MyException("你输错了");
}
}
}
个人笔记,思路,仅供参考