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 的异常默认是非受查异常

目录
相关文章
|
19小时前
|
Java 机器人 程序员
如何解决Java中的ClassCastException异常?
如何解决Java中的ClassCastException异常?
|
19小时前
|
Java 机器人 程序员
Java中如何处理ArrayIndexOutOfBoundsException异常?
Java中如何处理ArrayIndexOutOfBoundsException异常?
|
19小时前
|
安全 Java 机器人
解决Java中的NumberFormatException异常的实用方法
解决Java中的NumberFormatException异常的实用方法
|
19小时前
|
安全 Java 机器人
如何在Java中优雅地处理ConcurrentModificationException异常?
如何在Java中优雅地处理ConcurrentModificationException异常?
|
19小时前
|
Java 机器人 编译器
解决Java中的NoSuchElementException异常的常见方法
解决Java中的NoSuchElementException异常的常见方法
|
19小时前
|
Java 机器人 程序员
Java中如何处理FileNotFoundException异常?
Java中如何处理FileNotFoundException异常?
|
19小时前
|
Java 机器人 程序员
如何解决Java中的IOException异常?
如何解决Java中的IOException异常?
|
19小时前
|
SQL Java 机器人
Java中如何处理SQLException异常?
Java中如何处理SQLException异常?
|
19小时前
|
缓存 监控 Java
解决Java中的OutOfMemoryError异常的有效策略
解决Java中的OutOfMemoryError异常的有效策略
|
19小时前
|
算法 Java 机器人
如何在Java中处理StackOverflowError异常?
如何在Java中处理StackOverflowError异常?