第八章 异常

Java异常(Exception)概述

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数
据的格式,读取文件是否存在,网络是否始终保持通畅等等。

出现异常后会导致JVM(Java虚拟机)停止运行,后续程序无法执行

int a = 10;
int b = 0;
System.out.println(a/b);
//运行时会报错,除数不能为0

注意:代码或语法错误不是异常,语法错误的时候不会生成

异常抛出机制

Java中默认的异常处理机制:将出现的异常,按不同的类型分类为每一种异常封装了一个类来表示,当出现某种类型的异常情况时,会抛出此类的对象,然后终止虚拟机的运行

如果没有捕获到这个异常对象将导致程序终止

使用异常管理机制,对程序运行过程中出现的异常情况进行捕捉并处理

java异常体系结构

Throwable可分为两类,Error和Exception

Error:错误,是java虚拟机无法解决的严重问题,如JVM系统内部错误,资源耗尽等严重情况,一般不编写针对性的代码进行处理

例如:StackOverflowError(栈内存溢出),OutOfMemoryError(堆内存溢出)

Exception:其他因编程原因错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。

在这里插入图片描述

常见的异常

ArithmeticException算术异常(比如除数为0)

ArrayIndexOutOfBoundsException数组索引越界

StringIndexOutOfBoundsExcepiton字符串索引越界

ClassCastException类转换异常,Integer不能转换成String

NumberFormatException数字格式化异常

NullPointerException调用null对象实例方法/属性异常(一般称为空指针异常)


异常处理

throws

定义一个方法的时候可以使用throws关键字声明,表示此方法
不处理异常,而交给方法调用处进行处理

●任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
● 调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么
继续使用throws声明。
● 如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构

在编码时,就可能出现问题的代码(经验问题)预先编写一些处理机制

程序运行

出现异常执行处理机制,继续运行后续的程序

try{

编写可能出现异常的代码

}catch(异常类型){

处理机制

}catch(Exception e){

//可在最后catch Exception用于捕获所有类型的异常

}finally{

finally代码块中的内容一定会执行

一:当catch没有捕获成功时后面的代码无法执行,但是finally可以执行

二:确保在出现异常的情况下依然最终把流对象关闭

if(in!=null){  in.close();}

三:无论是try中还是catch中进行return操作,都必须在retrun之前先执行finally代码块

}

运行期异常和编译期异常

两者区别在于有没有继承RunTimeEcxeption

编译期异常(检查期异常)

在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,例如:FileNotFoundException(文件找不到异常)

编码不支持,文件找不到等…都属于检查期异常

RunTimeException(运行期异常)

(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免.

数组越界,算术异常,类型转换等…都属于运行时异常

throws和throw的区别

throws

用在方法声明部分,表示此方法中可能出现的某种类型的异常,此方法不处理异常,谁调用谁处理

throw

在方法体中,抛出一个具体的异常对象,该方法终止运行,在异常对象中的构造方法中自定义异常原因

自定义异常

自己定义的异常类,用API中的标准异常类的间接或直接到子类

作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆

基本语法

public class 异常类名 extends Exception/RuntimeException{
  public 异常类名(String msg){
    super(msg);
    }
}

自定义异常类中往往不写其他方法,只重载需要使用的构造方法

继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或者throws抛出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值