定义:
指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
Throwable分类:
i. 无法处理的错误:Error类
ii. 可以处理的异常
a) 必须处理的异常(检查checked异常):是Exception的子类但不是RuntimeException的子类
b) 可处理可不处理的异常(运行异常):是RuntimeException的子类
处理异常的方式:
1.捕捉异常:try{···} catch ( ) {···} [ finally{···} ]
2.声明异常:throws 异常
异常信息
// 异常自定义处理信息:错误标准输出
System.err.println("除数为0!!!");
// 打印堆栈信息
e.printStackTrace();
// 异常描述信息
e.getMessage();
import java.util.InputMismatchException;
import java.util.Scanner;
/*
* 此程序是简单计算两个数的商,但是程序会有异常:
* 异常一:接收整数时输入了非整数
* 异常二:除数为0
*/
public class D1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// try 里面存放可能会有异常出现的代码
try {
/*
* 一、未产生异常:try块代码正常执行,catch内代码不执行,再必定执行finally内代码
* 二、产生异常:try块执行产生异常,进入catch匹配异常,执行完之后再执行finally内代码
* 三、产生异常,catch未匹配到异常类型:程序中断
*/
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
} catch (ArithmeticException e) {
// 异常自定义处理信息:错误标准输出
System.err.println("除数为0!!!");
// 打印堆栈信息
e.printStackTrace();
// 异常描述信息
System.out.println(e.getMessage());
} catch (InputMismatchException e) {
System.out.println("输入有误!!!");
} catch (Exception e) {
System.out.println("未按照指定操作进行!!!");
} finally {
System.out.println("欢迎关注墨渐生微!!!");
}
System.out.println("程序结束!!!");
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* 处理异常方式二:声明异常
* throws 异常
*/
public class D2 {
public static void main(String[] args) throws ParseException {
String date = "2008-08-08 8:8:8";
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
* ParseException异常是checked异常:Exception的子类但不是RuntimeException的子类
* 必须处理的异常!!!
*/
Date time = dateformat.parse(date);
}
}
常见异常类型:
Excption :异常层次结构的父类
ArithmeticException: 算术错误异常
ArrayIndexOutOfBoundsException: 数组越界异常
NullPointerException: 空指针异常
ClassNotFoundException: 不能加载所需类
IllegalArgumentException: 方法接收到非法参数
ClassCastException: 对象强制类型转换出错
NumberFormatException: 数字格式转换异常
自定义异常
继承Throwable类或者Exception类或者RuntimeException类
/*
* 自定义异常
* 继承Exception类
* SexException异常为checked异常,必须处理!!!
*/
public class SexException extends Exception{
// 调用父类的有参构造方法
public SexException() {
// 参数为异常描述信息
super("性别必须是男、女");
}
}
手动抛出异常:throw
/*
* 手动抛出异常
*/
public class Student {
public String name;
private String sex ;
public int age;
public String getSex() {
return sex;
}
public void setSex(String sex) throws SexException {
if(sex.equals("男")|| sex.equals("女")){
this.sex = sex;
}else{
/*
* throw new 异常类型();
* 抛出一个自定义的性别异常!!!
*/
throw new SexException();
}
}
}
注意问题:
finally {···} 一定会执行;唯一不执行,中断虚拟机( System.exit(-1) );
先捕获子类异常,再捕获父类异常,顺序不可颠倒;
重写方法抛出异常范围不能大于被重写方法抛出异常的范围;
throw:抛出异常,必须是Throwable的子类;