异常
1.什么是异常
异常也就是指程序运行时发生错误,异常处理就是对这些错误进行处理和控制。
程序错误分为三种:
1.1 编译错误编译错误是因为程序没有遵从语法规则,编译程序能够自己发现并且提示我们错误的原因和位置。
1.2 运行时错误运行时错误是因为程序在执行时,运行环境发生了不能执行的操作。
1.3 逻辑错误逻辑错误是应为没有按照预期的逻辑顺序执行。
2.异常的处理机制
在应用程序中,异常的处理机制就是:抛出异常,捕捉异常
3.异常的抛出和捕获
异常抛出:
throws-抛的复数-可以抛出很多异常
使用throws声明当前方法有可能出现的异常给调用者
位置:在方法形参列表小括号之后
public static void main(String [] args )throws 异常1, 异常2,异常3,{}
可以声明多个异常,使用逗号隔开
调用者处理处理方式有两种:
a.如果方法声明的运行时异常(RuntimeException)那么调用者可以处理也可以不处理,编写代码可以通过。
b.如果方法声明是检查异常(CheckedException)那么调用者必须处理,否则代码编写失败。
检查异常处理也可以分为两种方式:
一是继续声明给JVM虚拟机不做处理
二是加上try-catch块处理掉异常。
throw-抛
位置:方法快内部,可以作为一条单独的语句,一条语句只能抛出一个异常
异常捕获:
一般用try- catch或者try-catch-finally来捕获异常。
try-尝试
将可能出现异常的代码放入try代码块中,但是尽量不要讲过多的代码块放入其中,没有阅读性。
try{
//代码块
}
catch-捕获
不能单独出现,必须结合try
多种异常可以书写多个catch块,顺序要求,先写子类,再写父类。
catch(捕获到的异常类型 e(创建的对象一般用e){
一般在这里输出异常
}
finally-最终
表示不管是否出现异常都执行的代码块,不能单独出现,必须和try 或者try-catch-finally
finally{
//代码块一定会执行的
}
适用场景:
通常用于关闭资源,或者一些必须执行的操作。
finally唯一不执行的情况,退出JVM虚拟机
System.exit(int status);//0表示正常退出,非0表示非正常退出,表示的含义不同,但是效果都是退出虚拟机。
3.1throws和throw的区别
throws 声明方法内抛出了异常,位置在形参列表之后,声明抛出异常类型并且可以抛出多个异常。
throw生成并抛出异常,位置在方法快内部,可作为单独语句,抛出一个异常对象,一条语句只能抛出一个。
4.自定义异常
当JDK提供的异常不能满足我们的开发时,我们可以自定义异常来实现需求。
1.编写异常类
2.继承父类(可以继承Exception、Throwable、RuntimeException都可以)
3.编写构造方法,传入异常信息
4.在代码块中抛出自定义异常
public class Student {
private String sex;
private int age;
private String idCard;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException {
if(age > 6 && age < 24 ) {
this.age = age;
}else {
throw new AgeException("年龄不合适");
}
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
}
class SexException extends Throwable{
}
class AgeException extends Exception{
public AgeException(String message) {
super(message);
}
}
class IdCardException extends RuntimeException{
}