5、异常处理

5、异常处理

Java程序在执行过程中发生的异常事件可分为两类:

  • Error:Java虚拟机无法解决的严重问题。

    如 JVM系统内部错误,资源耗尽等严重情况,

    比如 栈溢出:StackOverflowError,堆溢出:OutOfMemoryError

    错误一般不编写针对性的代码进行处理,异常主要指Exception

  • Exception:其它因编程错误或偶然的外在因素导致的一般性问题

    如: 空指针访问,试图读取不存在的文件,网络连接中断,数组角标越界等;

    对于这些错误,一般有两种 解决方法:
     一是遇到错误就终止程序的运行。
     另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理

  • image-20220324205043517

  • throw 与 throws 的区别?

    throw 生成异常(对象),声明在方法体内。

    throws 抓取(处理)异常的一种方式,声明在方法的声明处。

异常结构

image-20220324170452177

常见异常

异常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中的异常类型 若满足子父关系,则要求子类一定声明在父类的上面,否则报错。

 常用的异常对象处理方式:

  1. getMessage( ): String
  2. printStackTrace( )

 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需要处理异常
        }
    }
}

用户自定义异常

  1. 继承于现有的异常结构: RuntimeException、Exception
  2. 提供全局变量:serialVersionUID (序列号标识类)
  3. 提供重载的构造器
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("抛出自定义异常");
}
posted @   simp1e1  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示