Java中的异常

简介: Java中的异常

一、异常

1.1 为什么要用异常

Java中的异常(Exception)英文单词是例外的意思(学英语),如果不处理异常,将会导致软件异常中断,崩溃,退出,严重影响用户的使用和体验如果合理的应用异常处理那将会减少软件出现的错误,可以友好的提示用户,提升用户的体验。

1.2 异常是什么?

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。如:用户输入非法数据,做除法运算的时候除数为0,打开的文件不存在,网络中断,死递归,死循环导致栈溢出等。

1.3 异常的分类

(1)Throwable是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception

         而 Error 和 Exception 两子类分别表示错误和异常。

(2)Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。

(3)Error 定义了在通常环境下不希望被程序捕获的异常。Error 类型的异常用于 Java 运行时由系统显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例。

(1)运行时异常是RuntimeException类及其子类异常,这些异常是不检查异常,往常这些异常往往可以自己手动避免比如空指针异常,算数异常

(2)除了运行时异常那就是编译时异常了,也通常被叫做受查异常,就是你打出代码后,给你表红杠杠的就是受查异常

这下面就是算数异常,属于是非受查异常

下面就是受查异常了,编译的时候就标红杠杠

二、异常的处理

2.1 try…catch…finally 语句块

对检查异常处理的方式:使用 try…catch…finally 语句块处理;在函数定义中使用 throws 声明。

try{


       // try 块中放可能发生异常的代码。


}catch(ArithmeticException arithexception)


{


       // 1.每一个 catch 块用于捕获并处理一个特定的异常,或者异常类型的子类。


       // 2.catch 后面括号中定义了异常类型和异常参数。


       // 3.在 catch 块中可以使用这个块的异常参数来获取异常的相关信息。


       // 4.如果 try 块中发生的异常在所有catch中都没捕获到,则去执行finally,然后到这个          函数的外部 caller 中去匹配异常处理器。


       // 5.如果 try 中没有发生异常,则所有的catch快都不执行。


}catch(Exception exception){


       / / 捕获异常


}finally{


       // 1.finally 块是可选的。


       // 2.无论异常是否发生,finally 都会执行。


       // 3.一个 try 至少要有一个catch块,或者至少要有一个 finally 块。


       // 4.finally 块主要做一些关闭清理工作,如关闭文件等。


}  

public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        }catch (NullPointerException e) {
            System.out.println("捕获到了一个空指针异常!");
        }
        System.out.println("this is ok");
 
    }

(1)如果程序抛出异常,不处理异常,那就会交给JVM处理,JVM处理就会把程序立即终止

并且,即使用了try-each 也必须捕获一个对应的异常,如果不是对应异常,也会让JVM进行处理

(2)如果异常之间具有父子关系,那就必须子类异常在前,父类异常在后catch,不然会报错

其实可以想象一下,上面那个异常包括了下面那个异常其实下子类的那个异常就没有意义了

2.2 关键字 throws/throw

如果在写代码的时候,遇到问题就抛出去(狗头),这时候就需要使用throw这个关键字

throw是去抛异常,而throws是声明异常

public static void main(String[] args) {
        int a = 0;
        if(a == 0){
            throw new ArithmeticException("除数为0");
        }
        System.out.println(10/a);
 
    }

上面抛出的是非受查异常,如果我们抛出的是受查异常,那就需要使用throws去声明一下

声明后编译就通过了

1.如果说方法内部抛出了多个异常,throws之后就必须跟多个异常类型,用逗号进行分隔

2. 如果抛出多个异常类型有父子关系,直接声明父类

3.调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出

我就解释一下上面的第三条吧,如下图调用下面声明的方法时里面有受查异常,那调用者必须也要对该异常进行处理使用try catch,或者使用throws进行声明

三、自定义异常

java中自带的异常并不能满足我们开发时候的需要,所以就有了自定义类型的异常

自定义了一个密码异常

package library.Exception;
 
public class PassWordException extends RuntimeException{
 
    public PassWordException(){
        super();
    }
    public PassWordException(String s){
        super(s);
    }
}
package library;
 
import library.Exception.PassWordException;
 
public class demo1 {
    public static void func(){
        throw new PassWordException("兄弟密码错了");
    }
    public static void main(String[] args) {
        try {
            func();
        }catch (PassWordException e){
            System.out.println("捕获密码错误异常");
        }
        System.out.println("this is ok");
    }
}

自定义异常默认会继承 Exception 或者 RuntimeException

继承于 Exception 的异常默认是受查异常

继承于 RuntimeException 的异常默认是非受查异常

目录
相关文章
|
27天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
46 4
|
1月前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
2天前
|
Java Linux Windows
java打包异常【已解决】
java打包异常【已解决】
12 5
|
3天前
|
XML Java 数据格式
java异常-SpringBoot-
java异常-SpringBoot-
7 0
|
3天前
|
Java Android开发
Java 程序设计 第6章 异常与断言 笔记
Java 程序设计 第6章 异常与断言 笔记
|
3天前
|
数据采集 Java Linux
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
15 0
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
|
6天前
|
存储 分布式计算 大数据
MaxCompute操作报错合集之通过UDF调用异常(其他使用http调用正常)。报错:java.lang.NoSuchMethodError:是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
12天前
|
搜索推荐 Java
Java异常:IllegalArgumentException Collections.sort报错
Java异常:IllegalArgumentException Collections.sort报错
|
16天前
|
Java 编译器 程序员
【Java ——异常机制详解】
try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。 catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。 finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。 throw – 用于抛出异常。
|
19天前
|
Java 程序员 数据库