异常类概念
*异常:程序运行过程中 遇到不正常的情况(程序无法正常运行)
*异常体系:由一堆异常类组成
*异常体系的顶层父类:Throwable
*java处理异常原理:把异常情况封装成对象 把对象交给虚拟机/程序进行处理
*
*Throwable:按异常严重情况分类
*Error: 非常严重的异常: 不能通过代码逻辑进行处理的异常情况 一般是内存/虚拟机/语法出现的错误
* eg: int a::java.lang.Error: Unresolved compilation problem:
* test();//java.lang.StackOverflowError
* new long[1024][1024][1001];//java.lang.OutOfMemoryError: Java heap space
* Exception:通过代码逻辑可以处理的异常情况
* Exception按是否继承RuntimeException分类
* 继承了RuntimeException的异常---运行时异常(UnChecked Exception)
* 没有继承RuntimeException的异常---编译时异常(Checked Exception)
* eg://
Class cla=Class.forName("Student");//ClassNotFoundException: Student
new SimpleDateFormat("yyyy-MM-dd").parse("111");//ParseException: Unparseable date: "111"
System.out.println(1/0);//ArithmeticException: / by zero
System.out.println(new String(new byte[] {1,2},"gbk1"));//UnsupportedEncodingException: gbk1
String s=null;System.out.println(s.length());//NullPointerException
int[] arr= {};System.out.println(arr[1]);//ArrayIndexOutOfBoundsException
System.out.println((String)(new Object()));//ClassCastException
int n=Integer.parseInt("aa");//NumberFormatException
int n=new Scanner(System.in).nextInt();//InputMismatchException System.out.println("11".charAt(3));//StringIndexOutOfBoundsException
System.out.println(new ArrayList<>().get(0));//IndexOutOfBoundsException
*
*异常体系的特点:
* 特点1:Throwable的所有子类都没有特有方法 所有方法都继承于Throwable
* 异常体系中类之间的区别只在于类名和异常原因
* 特点2:异常体系中子类的名字都是以Error和Exception结尾
Error 和 Exception
error和exception的区别 并列出5种以上常见的异常类型(中文+英文)
Error:错误 程序运行出现严重错误 无法通过代码逻辑进行处理
一般是内存或者虚拟机出现问题
Exception:异常 程序无法正常运行 可以通过代码逻辑进行处理的异常情况
常见的异常:
StringIndexOutofBoundsException:字符串下标越界异常
ClassNotFoundException:类找不到异常
FileNotFoundException:文件找不到异常
NullPointerException:空指针异常
NumberFormatException:数字格式异常
ArithmeticException: 数学运算
ParseException:字符串解析异常
EOFException:到达文件末尾异常
IOException:io流异常
SQLException:sql语句异常
RuntimeException:运行时异常
Throwable类
* 1 构造方法:
* Throwable() :不指定错误原因
* Throwable(String message) :参数是错误原因
2 String toString() : 获取异常类型:异常原因
java.lang.ArithmeticException: / by zero
3 String getMessage() :获取异常原因
4 void printStackTrace() :调用标准错误输出流
java.lang.Throwable: 出错了!
at com.zhiyou100..Demo03Throwable.main(Demo03Throwable.java:60)
throw 和 throws的区别
throw和throws的区别
throw:用于在方法体中 表示程序出现异常情况
throws:用于在方法声明上 声明当前方法可能产生那些异常
不同之处:位置不同:throw用在方法体中 throws用在方法声明上
后面的内容不同: throw后面跟一个异常对象 throws后面跟多个异常类型
作用不同:throw:用于在方法体中 表示程序出现异常情况
throws:用于在方法声明上 声明当前方法可能产生那些异常,一旦产生此类异常 异常被抛给方法的调用者
异常处理:抛出机制
* 异常处理方式之抛出机制:把可能产生的异常封装为对象 抛给方法的调用者
* 格式:在方法声明上添加一个throws 异常类型1,异常类型2...
*
* 注意1:如果程序一直选择通过抛出机制来处理异常:异常最终抛给虚拟机
* 虚拟机统一处理方式:打印异常输出流 然后终止程序
* 注意2:如果方法的某段代码出现异常 而选择抛出机制来处理异常 那么当前方法的其他代码不再执行
* 注意3:子类重写父类的方法:子类方法不能抛出比父类方法多的大的异常
*
* 方法声明加throws xxxException的作用:
* 1 声明当前方法可能产生那些异常
* 2 如果产生指定的异常 当前方法不处理 而是把异常对象抛给方法的对应者
*
* 编译时异常和运行时运行
* 编译时异常:没有继承RuntimeException的异常
* 运行时异常:继承RuntimeException的异常
* 区别:1 如果代码可能产生编译时异常 编译器会报错 要求必须对编译时异常进行处理
* 如果代码可能产生运行时异常 编译器不检查 方法默认抛出可能产生的运行时异常
* 2 编译时异常只有在指定情况下才会产生 出现的频率低
* 运行时异常出现的频率比较高
* 3 编译时异常没有继承RuntimeException
* 运行时异常继承了RuntimeException
代码
public static void main(String[] args)throws UnsupportedEncodingException, ParseException {
System.out.println("main方法开始");
test1();//调用者必须对 所调用方法抛出的异常进行处理
System.out.println("main方法结束");
}
public static void test1() throws UnsupportedEncodingException, ParseException {
System.out.println("test1方法开始");
String s=new String(new byte[] {46, 48,49},"gbk1");
//Unhandled exception type UnsupportedEncodingException
Date date=new SimpleDateFormat("yyyy-MM-dd").parse("1234-11-12");
//ParseException
System.out.println("test1方法结束");
}
异常处理:捕获机制
* 异常处理方式之捕获机制: 通过代码逻辑对产生的异常进行处理
* 格式:
* try{
* 可能产生异常的代码块
* }catch(定义引用接受产生的异常对象){
* 异常处理的代码
* }finally{
* 不管是否出现异常 都要执行的代码
* }
*
* 捕获机制注意事项:
* 1 当try代码块中出现异常 try代码块不再执行 而是执行对应的catch代码块
* 2 无论是否出现异常 无论catch任何处理异常 都要执行finally代码块(除了System.exit(0))
一般情况下:finaly代码块 用于关闭流释放资源
3 捕获父类异常的catch 必须写在捕获子类成员的catch后面
开发过程中遇到异常:尽量捕获 避免抛出
代码
public static void main(String[] args){
test1();//调用者无需对方法中的异常进行处理 因为方法本身已经对可能产生的异常处理掉了
System.out.println(11);
}
public static void test1() {
System.out.println("test1方法开始");
try {
System.out.println("try代码块开始");
String s=new String(new byte[] {46, 48,49},"gbk1");
System.out.println(1);
Date date=new SimpleDateFormat("yyyy-MM-dd").parse("1234-11-12");
System.out.println("try代码块结束");
Class cla=Class.forName("xxx");
}catch(UnsupportedEncodingException e) {
System.out.println("catch__1");
System.out.println("对异常UnsupportedEncodingException进行处理的代码!");
//System.exit(0);
//long[][][][] arr=new long[1024][1024][1024][1024];
return;
}catch(ParseException e) {
System.out.println("catch__2");
System.out.println("对异常ParseException进行处理的代码!");
}catch(Exception e) {//抛出父类异常的catch必须放在抛出子类异常catch的后面
System.out.println("catch__3");
System.out.println("对异常Exception进行处理的代码!");
}finally {
//无论是否出现异常 无论catch任何处理异常 都要执行finally代码块(除了System.exit(0))
//一般情况下:finaly代码块 用于关闭流释放资源
System.out.println("finally代码块!");
}
System.out.println("test1方法结束");
}
自定义异常
public class Demo06MySelfException {
/*
*自定义异常:定义一些jre中不存在的异常
*步骤:
* 1 继承异常体系中的类 才能称为异常类
* 2 提供一个有参数的构造方法 并通过调用super(message)来传递异常原因
* 3 在方法中通过throw来产生一个自定义异常情况
* 4 对异常情况进行处理
* */
public static void main(String[] args){
char sex='妖';
//创建了一个异常对象:不是出现异常情况
SexNotSupportedException e=new SexNotSupportedException("性别不存在!");
//throw 异常对象;表示程序出现异常情况
if(sex!='男'&&sex!='女') {
//4 对产生的异常进行处理
try {
throw e;//3 通过throw产生一个自定义类型的异常情况
} catch (SexNotSupportedException e1) {
System.out.println("性别:"+sex+"不合理!");
sex='男';
}
}
System.out.println("sex="+sex);
}
//final、finally、finalize
//throw和throws的区别
//位置不同:throw用在方法体中 throws用在方法声明上
//后面跟的内容不同:throw后面跟一个异常对象
// throws后面跟多个异常类型
//作用不同:throw 用在方法体中表示当前方法运行时产生了一个异常情况
// throws 用在方法声明上 表示当前方法可能产生那些异常 如果产生这些异常就抛给方法的调用者去处理
}
//1 继承异常体系中的类 才能称为异常类
class SexNotSupportedException extends Throwable {
//2 通过构造方法的参数列表指定异常原因
public SexNotSupportedException(String message) {
//通过调用父类有参数的构造方法来传递异常原因
super(message);
}
}