1.简介
Throwable是所有异常类的父类;异常类分为Error和Exception两大类
异常:程序运行过程中发生的错误,即不正常的事,异常会中止程序运行,相当于感冒,阑尾炎,将异常处理掉,可以继续执行
Error:描述的是java运行系统内部错误和底层资源耗尽的错误,一般就是JVM错误,比较严重,仅仅靠应用层通过代码进行修改也不能恢复正常执行,致命性异常,相当于非典,艾滋,癌,必须修改源程序
Exception:非致命性异常,可以通过捕获处理后继续正常执行
运行时异常:程序运行时发生的异常 编译时期可以不处理 ---->抛出 捕获
非运行时异常:编译时异常 编译时期必须处理 ---->抛出 捕获
当异常情况发生,将导致程序异常终止,java的异常处理是运行时错误的处理和恢复。(保证程序不因出现异常而中止运行,必须要对出现的异常进行处理)
异常本身使用类描述,产生一个异常就代表该异常的对象被创建,并且在导致该错误的方法中被引发(throw,或称为抛出),可以充分发挥类的可扩展和可重用的优势。
2.异常的常用分类:
方法名 |
说明 |
ArithmeticException |
算术错误,例如:零作除数 |
IndexOutOfBoundsException |
下标越界 |
NullPointerException |
访问 null 对象成员 |
ClassNotFoundException |
不能加载所需的类 |
InputMismatchException |
欲得到的数据类型与实际输入类型不匹配 |
IllegalArgumentException |
方法接收到非法参数 |
ClassCastException |
对象强制类型转换出错 |
SQLException |
数据库操作异常 |
ParseException |
解析异常 |
3. 异常处理方式
使用逻辑判断可以起到防止程序异常终止的作用,但是这种程序逻辑与错误处理一起混用,使程序难以维护和调试;对于极少数情况发生的错误,每次运行都要进行判断,降低程序的性能。
1. 默认处理机制:控制台打印异常信息,程序异常终止
2. 五个关键字:try catch finally(捕获异常) throw throws(抛出异常)
捕获异常常用的的三种格式:try语句不能单独写 后面必须跟上catch或者finally
1.try{
//可能会发生异常的代码,和发生异常后不能执行的代码
}catch(异常类型 异常名){//异常处理函数:异常类型限定该函数所能处理的异常类型
//发生异常后,所进行的异常处理
}
a. 没有发生异常,程序正常执行,得到result
b. 发生异常,程序就会执行对应catch的代码块
c. 当发生异常的类型和catch函数所能处理的异常类型不匹配,catch函数不能处理异常
2.try{
}catch(异常类型 异常名){//异常处理函数:异常类型限定该函数所能处理的异常类型
//对异常所进行的处理
}finally{
//无论异常发生与否,都执行此处代码
}
3.try finally只捕获不处理
当发生异常后,会按照顺序查看每个catch语句,并执行第一个与异常类型匹配的catch语句;其他语句忽略。捕获异常时先捕获子类,再父类(先小后大,先具体后概括)
三种格式的两种处理:
1.分别捕获,分别处理
2.一个try,多个catch
try{
//发生多个异常的代码和发生异常不能执行的代码
}catch(异常类型1 ex){
//对发生异常类型1的处理
}catch(异常类型2 ex){
//对发生异常类型2的处理
}
...
finally{
}
4. 自定义异常类使开发人员更加方便地定义程序出错位置且更加详细地描述异常信息,例如:
1.创建一个类继承Exception
public class SexException extends RuntimeException{
/*
异常常用方法:toString()
getMessage()
printStackTrace()
*/
public SexException() {
super();
// TODO Auto-generated constructor stub
}
2.在当前创建的类中定义有参的构造方法,并在构造方法中调用父类构造方法
public SexException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
@Override
public String getMessage() {
// TODO Auto-generated method stub
return super.getMessage();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
}
public class Person {
//自定义异常
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) throws SexException{
if(sex.equals("男")||sex.equals("女")){
this.sex=sex;
}else{
//无法解决这个异常 抛出异常
3.在程序中使用自定义异常类即可
throw new SexException("性别错误");
}
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + "]";
}
}
import java.util.*;
1. 继承Exception
public class MyException extends Exception{
public MyException(String msg) {
2.构造方法中调用父类构造方法
super(msg);
}
}
class Demo {
public static void main(String args[]) throws Exception {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
if((age<0)||(age>100))
3.使用自定义异常类
throw new MyException("输入的年龄非法");
}
}
5. 异常常用方法:异常名e
1. System.out.println(e);相当于System.out.println(e.toString());
输出->exception_5_2.SexException: 性别错误
2. System.out.println(e.getMessage());
输出->性别错误
3. System.out.println(e.printStackTrace());
输出->exception_5_2.SexException: 性别错误
at exception_5_2.Person.setSex(Person.java:21)
at exception_5_2.Exception3.main(Exception3.java:11)
6. 子类重写父类方法时,可以抛出运行时异常,但是抛出的编译异常必须是父类的子集。