Java 异常
Java 异常
异常分类
error:Java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况,一般不编写针对性的代码进行处理。
exception:运行过程中发生了人们不希望发生的事件,可以使用针对性的代码进行处理。如空指针访问、数组角标越界。
Java源程序 –javac.exe–> 字节码文件 –java.exe–> 在内存中加载、运行类
编译时checked异常 | 运行时runtime异常 | |
---|---|---|
发生时机 | 执行javac.exe文件名时,可能出现的异常 | 执行java.exe文件名时,可能出现的异常 |
说明 | 只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。 | Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。一般不处理运行时异常。 |
常见异常 | Java.lang.ClassNotFoundException Java.lang.NoSuchMetodException |
Java.lang.IndexOutOfBoundsException Java.lang.NullPointerException |
:
异常处理机制
抛:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出给调用者,由调用者执行,异常处后续的代码将不会执行。
抓:异常的处理方式,try-catch-finally与throws
方法重写的规则之一:
子类重写的方法抛出的异常类型 <= 父类该方法抛出的异常类型
多态的时候处理了父类的异常,使用子类的该方法时抛出的异常比父类的小所以也可以处理。
开发中如何选择使用哪种方法?
- 如果父类被重写的方法没有throws处理异常,则子类重写的方法也不能用throws
- 递进关系(A->B->C)的方法调用中,各方法分别采用throws,整体集中try-catch
- 当前方法知道如何处理该异常,则用try...catch块来处理该异常。当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
异常处理机制一:try-catch-finally
1.finally可选,一定会执行即使try-catch里面有异常或者return。
2.只会匹配一个catch,类似if-ifesle
3.若catch中的异常类型有子父类关系,则子类要写在父类的上面,否则报错。(先小再大,如果先大那么小的异常类型永远不会被匹配到)
4.在try结构中声明的变量,在出了try结构之后,就不能被调用。
5.像数据库连接、输入输出流、网络编程Socket等资源,JVM不能自动的回收,需要手动进行释放。此时的资源释放就需要声明在finally中。
6.try-catch不会影响到后面的代码
try{
//可能出现异常的代码
//!!!!try内部异常后面的代码不会执行!!!!!
}catch(异常类型1 变量名1){
/*
String getMessage() 获取异常信息
printStackTrace() 打印堆栈信息
*/
e.getMessage();
e.printStackTrace();
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}finally{
//try-catch执行完后执行
//一定会执行的代码
}
由于try-catch是异常的最终解决方案,捕获到错误就去解决,所以不会影响到后面的代码。
如下代码的两个try-catch都会执行。
try{}catch(){
}
try{}catch(){
}
体会1:使用try-catch-finally处理编译时异常,使程序在编译时不会再报错,但是运行时仍可能报错,相当于将一个编译时可能出现的异常延迟到运行时出现。
体会2:开发中,由于运行时异常比较常见,一般不处理运行时异常。
异常处理机制二:throws + 异常类型
class ExceptionTest{
//写在方法声明处,指明此方法执行时,可能会抛出的异常类型。
public void method() throws 异常类型{
//并没有捕获异常,只是将异常往上抛
//真正的处理是try-catch
}
public static void main(String[] args){
int index = 10;
String str = "hello world"
if(index>=str.length()){
throw new StringIndexOutOfBoundsException();
}
else{
str.substring(0,index);
}
}
}
throws的方法只是将异常抛给了方法的调用者,并没有真正将异常处理掉。
抛出异常有三种形式
- throws:作用在方法上,用于定义方法可能抛出的异常
- throw:作用在方法内,表示明确抛出一个异常
- 系统自动抛出异常:如StackOverflowError,OutOfMemoryError
用户自定义异常
手动抛出异常
关于异常对象的产生:
①系统自动生成的异常对象
②手动的生成一个异常对象,并抛出throw (i)
运行时异常可以不用处理
//运行时异常可以不用处理
throw new RuntiomeException("有些有message参数")
//需要处理因为包含了编译时异常,可选throws或者try-catch-finally
throw new Exception("xx")
自定义异常类
//1.继承现有的异常结构RuntimeException、Exception
public class MyException extends RuntimeException{
//2.提供全局常量:serialVersionUID,唯一标识类
static final long serialVersionUID = -70343551545L;
//3.提供重载的构造器
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
throws和throw的区别
类型 | 位置 | 功能 |
---|---|---|
throws | 作用于方法上,后面跟异常类 | 声明方法运行过程中可能出现的异常,处理异常的一种方式 |
throw | 作用于方法内,后面跟异常类 | 生成一个异常对象,抛出一个异常类的对象 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix