异常的概述
异常:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。异常本质就是Java当中对可能出现的问题进行描述的一种对象体现。
常见异常:
除数不能为0异常(ArithmeticException)
空指针异常(NullPointException)
数组越界异常(ArrayIndexOutOfBoundsException)
类型转换异常(ClassCastException)
异常分类
Error:称为错误,由Java虚拟机生成并抛出,程序对其不做处理。
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。
编译时期异常:不是继承自RuntimeException的Exception的子类都成为编译时期异常。
public class ExceptionDemo {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println(a/b);
}
异常处理
如果我们不做任何处理,异常将会交由虚拟机来处理
虚拟机的处理方式:
把异常的名称,异常出现的位置,异常原因,等信息输出打印在控制台,并同时将 程序停止执行。
思考:在实际开发当中显然直接将应用程序挂掉的这种方式是不可取的,就算程序有异常,我们也理应让程序继续执行下去,提高用户体验。那我们又该怎么做呢?
我们自己处理异常的方式:
1、try...catch...finally
2、throws抛出异常(后续讲解)
单个异常的处理
try...catch...finally的处理格式:
异常处理的格式:
try{
//放置程序可能出现问题的代码
}catch(异常类 异常名){
//这里放置异常处理的代码
} finally{
//释放资源
}
异常执行的三种情况
多个异常的处理
格式:try{
...
}catch(异常类名 变量名) {
...
}catch(异常类名 变量名) {
...
} catch...
排列catch 语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句
Java中的Error我们没有办法处理,我们只需要关心Exception的处理。
然而异常分为两大类:编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常。
编译时异常:
Java程序必须处理,否则无法通过编译,程序报错。
运行时异常:
程序可以不处理,但是建议一旦发现就应该和编译时异常一样处理。
//处理异常的目的:并不是为了修复程序的错误,而是就算程序出现了错误,也能够让程序继续运行
//JVM默认是如何处理异常的?
//1.打印错误信息
// a。异常名称java.lang.ArithmeticException
// b.异常的消息/bu zero
// c。异常所发生的方法位置 at com.sxt.exceptiondemo.ExceptionDemo01.main
// d.异常所在JAVA文件中ExceptionDemo01.java
// e.异常发生行号14
//2.终止程序
// System.exit(0);
//JVM处理异常的方式不能满足我们开发的需求,那么我们需要自己处理异常。
//如何来处理异常?
// 方式一; try...catch...finally
// 方式二:throws
/* 方式一处理异常:
* try{
* //放置程序可能出现问题的代码
* }catch(异常类 异常名){
* //这里放置异常处理的代码
* }finally{
* //释放资源
* }
* 注意:
* 1.try块的代码越少越好
* 2.try块中一旦发生异常,那么try块中发生异常后面 所有的代码都不会执行
* 3.多个catch块中只会执行一个‘
* 4.Exception接受异常必须放在异常的最后面,满足先子类后父类
* 异常的执行流程:
* 1.程序执行到错误行,系统就会创建一个异常对象,并且抛给我们
ArithmeticException exp = new ArithmeticException("/by zero");
throw exp;
2.程序进入catch匹配异常
匹配成功,程序进去catch代码块
ArithmeticException ae = exp;
匹配失败,交给JVM处理
处理异常的标准方式:
1.能够显示处理的尽量显示处理,提高程序的可读性
2.但是一定要在异常处理的最后加上父类Exception处理
*/
public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println("start Application");
int a = 10;
int b = 0;
int [] arr = new int [3];
Object obj = null;
Object obj2 = new Integer(100);
try {
System.out.println(a/b);
} catch (ArithmeticException ae) {
System.out.println("算数异常,出问题1");
}catch (ArrayIndexOutOfBoundsException aioobe) {
// TODO: handle exception
System.out.println("数组越界,出异常2");
}catch (NullPointerException ne) {
// TODO: handle exception
System.out.println("空指针异常,出问题3");
}
System.out.println("End");
}
}