异常处理
异常处理
一.异常:程序运行过程中出现的不正常的现象
二.分类: Throwable
Exception(异常) Error(错误)
运行时异常(RuntimeException) 编译时异常
异常和错误的区别:异常是程序员能够处理的情况,而错误一般是硬件,运行环境,设计等原因导致的,程序员不能去处理。
运行时异常和编译时异常的区别:一般来说,运行时异常为语法错误;而编译时异常为语法错误,连编译都无法通过。
三.异常处理---抓住异常
A)三个关键字:try catch finally
B)处理步骤:
I. 情况一:有了try-catch处理,程序运行过程中,出现了异常,并且处理时产生的异常和catch的异常匹配,进入catch处理,异常处理完成.
II.情况二:有了try-catch处理,程序运行过程中,没有出现异常,不会进入catch语句,异常处理结束。
III.情况三:有了try-catch处理,程序运行过程中,出现了异常e,进入catch块进行了匹配,没有匹配上,异常处理失败,程序终止运行。
IV.情况四:有了try-catch处理,并且catch块有多个,程序运行过程中,出现了异常e,进入catch1块进行匹配,如果匹配失败,继续匹配catch2块,依次向下...,如果catchN块匹配成功,进入catchN块,其他catch块忽略,异常处理成功。
V.情况五:finally块不管发生任何情况都会执行
例:package pro0730;
import java.util.InputMismatchException;
import java.util.Scanner;
public class DemoA {
//情况一
public void a(){
try{//程序中的内容有可能出现异常
int i=9/0;//这一段话出现了异常,进入catch处理语句,处理完成后,继续代码运行
System.out.println(i);
}catch (Exception e){//如果出现异,那么进入到catch红去处理
System.out.println("除数不能为0");
}
System.out.println("程序结束");
}
//情况二
public void b(){
try{//程序中的内容有可能出现异常
int i=9/3;//这一段话没有出现异常,不会进入catch语句,继续代码运行
System.out.println(i);
}catch (Exception e){
System.out.println("除数不能为0");
}
System.out.println("程序结束");
}
//情况三
public void c(){
try{//程序中的内容有可能出现异常
int i=9/0;//
System.out.println(i);
}catch (NullPointerException e){//异常与catch块处理的异常不匹配
System.out.println("除数不能为0");
}
System.out.println("程序结束");
}
//情况四
Scanner aka=new Scanner(System.in);
public void d(){
try{
System.out.println("Input:");
int a=aka.nextInt();
int i=9/a;
System.out.println(i);
}catch(ArithmeticException e){
System.out.println("除数不能为0");
}catch( InputMismatchException e){
System.out.println("c数据输入异常");
}
System.out.println("程序结束");
}
//情况五
public void e(){
try {
int []arr=new int[5];
System.out.println(arr[8]);
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
}finally{//不换发生任何情况都会执行该语句内容
System.out.println("我是finally里面的内容");
}
System.out.println("程序运行结束");
}
public static void main(String[] args) {
new DemoA().a();
new DemoA().b();
new DemoA().c();
new DemoA().d();
new DemoA().e();
}
}
C)注意:
1.异常处理代码书写顺序Try-catch=finally
2.Try为可能产生异常的块必须书写
3.Catch为处理异常的块,可以有1~N个
4.Finally可以书写可以不写,若写,只能有一个
5.如果有多个catch块,按照先子类后父类的原则书写,子类更具体,父类更通用。
四.异常处理---抛出异常
A)关键字:throw throws
例:package pro0730;
public class DemoB {
public void a(int m)throws Exception{
if(m>7){
//认为有异常,抛出一个异常对象
throw new Exception();
}
}
public void b()throws Exception{
a(8);
}
public void c(){
try{
b();
System.out.println("没有异常");
}catch(Exception e){
System.out.println("处理了异常");
}
}
public static void main(String[] args) {
new DemoB().c();
}
}
五.常见异常处理:java.lang.Exception;所有异常的父类
java.lang.RuntimeException;所有运行异常的父类
java.lang.NullpointerException;空指针异常,调用了未经初始化的对象或者是不存在的对象
java.lang.ClassNotFountException;指定的类不存在,类的路径不存在
java.lang.ArithmeticException:数学异常,不符合数学运算规定
java.lang.ArrayIndexOutOfBoundsException;数组下表异常,下表越界超过了范围
java.lang.IllegalArgumentException;方法的参数错误,参数传递错误
java.lang.ClassCastException;强制转换类型异常
java.lang.NumberFormatException;数字转换异常
java.lang.FileNotFoundException;//文件未找到异常
java.lang.SQLException;操作数据库异常
java.lang.IOException;输入输出异常
六.自定义异常:
例:package pro0730;
public class DemoC {
public void a(int age) throws DemoCException{
if(age <0||age>100){
DemoCException e=new DemoCException();
throw e;
}
}
public static void main(String[] args) {
try {
new DemoC().a(102);
} catch (DemoCException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
注意:final:方法修饰符,最终的类,属性,方法
finally:异常处理的关键字,最终地,代表异常是否处理都会执行的代码块
finalize:是object类的一个方法.