5、异常处理
5、异常处理
Java程序在执行过程中发生的异常事件可分为两类:
-
Error:Java虚拟机无法解决的严重问题。
如 JVM系统内部错误,资源耗尽等严重情况,
比如 栈溢出:
StackOverflowError
,堆溢出:OutOfMemoryError
错误一般不编写针对性的代码进行处理,异常主要指Exception
-
Exception:其它因编程错误或偶然的外在因素导致的一般性问题
如: 空指针访问,试图读取不存在的文件,网络连接中断,数组角标越界等;
对于这些错误,一般有两种 解决方法:
一是遇到错误就终止程序的运行。
另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理 -
-
throw 与 throws 的区别?
throw 生成异常(对象),声明在方法体内。
throws 抓取(处理)异常的一种方式,声明在方法的声明处。
异常结构

常见异常
异常Exception分为:编译时异常 和 运行时异常
编译时异常:
IOException(流传输异常)
-- FileNotFoundException
ClassNotFoundException(类未找到)
SQLException(数据库操作异常)
InterruptedException(一个线程被另一个线程中断)运行时异常:
NullPointerException (空指针异常)
IndexOutOfBoundsException (越界异常)
NumberFormatException (数值转换异常 "abc"转数字)
ClassCastException (类型转换异)
InputMismatchException(输入不匹配)
AruthmeticException (算术异常)
两种异常处理方式
-
try-catch-finaly (自己能够处理)
-
thows + 异常类型 (自己处理不了,交给上级处理)
Java提供的是异常处理的 抓抛模型。
Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
异常对象的生成:
-- 由虚拟机 自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出
-- 由开发人员 手动创建:Exception exception = new ClassCastException();——创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样
try-catch-finally
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}
finally{ //(finally可不写)
//一定会执行的代码
}
catch中的异常类型 若满足子父关系,则要求子类一定声明在父类的上面,否则报错。
常用的异常对象处理方式:
getMessage( )
: StringprintStackTrace( )
try{ }中声明的变量,出了try结构后就不能再使用。
使用try-catch-finally 处理编译时异常后 , 使其在编译时不报错,运行时仍可能报错。
通常不对运行时异常进行 try-catch-finally处理(编译时异常一定要处理)
finnaly:
finally是可选的。
finally是一定会被执行的,会在catch中出现的异常、return语句 (即将要结束之前) 之前执行。
像数据库连接,输入输出流,网络编程Socket等资源, JVM是不能自动回收的,我们需要自己手动进行资源的释放。此时就需要将其声明在finally中。
throws + 异常类型
public class AA{
public static void main(String[] args){
try{
method();
}catch(IOEcception e){
e.printStackTrace();
}
}
public void method() throws IOException{
method1();
}
public void method1() throws IOException{ //抛出异常
File file = new File("hello.txt");
}
}
"throws + 异常类型" 写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。-- 异常代码后续的代码 将不再执行。
try-cathc-finally 真正的将异常处理掉, 而throws只是将异常抛给了方法的调用者,并没有将异常处理掉。
小结:
若父类中重写的方法没有throws方式处理异常,则子类重写的方法也不能throws,必须使用try-cathc-finally处理。
执行方法a中,又调用了另外几个方法 , 且这几个方法是递进关系执行时,则推荐:
被调用的方法使用 throws 的方式处理;
执行的方法a 使用try-catch-finally 方式处理。
手动抛出异常throw
异常对象的产生有两种方式:
- 系统自动生成的异常对象
- 手动的生成一个异常对象,并抛出(throw)
class A{
public void method(int id){
if(id>0){
this.id = id;
}else{
//sout("数据有误");
throw new RuntimeException("数据有误"); //手动抛出异常(运行时异常)
throw new Exception("数据有误"); //编译时异常,使用Exception需要处理异常
}
}
}
用户自定义异常
- 继承于现有的异常结构: RuntimeException、Exception
- 提供全局变量:serialVersionUID (序列号标识类)
- 提供重载的构造器
public class MyException extends RuntimeException{ //继承异常结构
static final long serialVersionUID = -7655544L; //全局变量 序列版本号
public MyException(){
}
public MyException(String msg){ //提供重载的构造器
super(msg);
}
}
public void myMian() throws RuntimeException{
new MyException("抛出自定义异常");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!