【Java】异常

简介: 【Java】异常

1.认识异常

1.1 异常的概念

异常顾名思义(异:不同的  常:平常),不同于平常的就是异常


比如:有一天篮球哥上完厕所,当他按冲水键的时候,发现冲水键坏了,那么这就是异常


Java中异常:程序执行过程中发生的不正常行为称为异常


1.2 常见的异常

我们写代码时,常见的异常有算术异常、数组越界异常、空指针异常


①算术异常


System.out.println(10/0);

运行结果:

去.png



②数组越界异常


int[] arr = new int[]{1,2,3,4,5,6};
System.out.println(arr[7]);

运行结果:


请.png


③空指针异常


int[] arr = null;
System.out.println(arr.length);

运行结果:

其.png



从上述几个常见异常运行结果中可以看出,不同类型的异常,都有与其对应的类来进行描述


算术异常是通过 java.lang 这个包里面的 ArithmeticException 这个类进行描述的

数组越界异常是通过 java.lang 这个包里面的  ArrayIndexOutOfBoundsException 这个类进行描述的

空指针异常是通过 java.lang 这个包里面的 NullPointerException 这个类进行描述的

2.异常的体系结构

上述我们只是举了几个常见的异常,但是异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

前.png



上述讲的常见的异常都属于 Runtime Exception 运行时异常


Throwable:是异常体系中的顶层类,这个类派生出了两个子类一个是 Error(错误)和 Exception(异常)


Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowError 和 OutOfMemoryError,一旦发生回力乏术

Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行 。就像我们之前举上厕所的例子一样,厕所修好了,就可以正常使用了

3.异常的分类

异常可能在编译时发生错误,还可能在运行时发生错误,根据发生的时机不同,可以将异常分为两类:

我.png



3.1 编译时异常

编译时异常:在程序编译期间发生的异常,就叫做编译时异常,也称为受检查异常。会直接报错,除非处理掉这个异常,程序才会正常编译


class Person {
    private String name;
    private int age;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        Person person1 = (Person)person.clone();
    }
}

如果不声明 throws CloneNotSupportedException,程序就不能正常编译。


为.png


throws CloneNotSupportedException 代表这个方法可能会出现异常,但是不进行处理,交给调用者进行处理。


在 Person 类中重写了父类 Object 里面的 clone 方法,并且声明了 throws CloneNotSupportedException 那么就是这个方法出现了异常,也不会进行处理。而是交给调用它的 main 方法进行处理,main 方法也声明了 throws CloneNotSupportedException,那么main方法也不会进行处理,也就交给调用 main 方法的处理,最后也就是交给了 JVM 去处理了


3.2 运行时异常

运行时异常:在程序运行期间发生的异常,就叫做运行时异常,也称为非受检查异常


RunTimeException以及其子类对应的异常,都称为运行时异常 。我们上述讲的算术异常、数组越界异常、空指针异常都是运行时异常。在写的时候并不会报错,在运行期间才会报错

五.png



注:编译时出现的语法性错误,不能称之为异常。比如你把一个关键字写错了此时编译过程中就会出错, 这是 "编译期" 出错。而运行时指的是程序已经编译通过得到 class 文件了, 再由 JVM 执行过程中出现的错误


4.异常的处理

异常的处理通常有两种:

玩.png



4.1 事前防御型

事前防御型:就是用来防止出现异常,在操作之前就做充分的检查


class SignIn {
    private String userName = "abc";
    private int password = 123;
    public void confirm(String userName,int password) {
        if (!(this.userName.equals(userName))) {
            System.out.println("用户名错误");
            return;
        }
        if (!(this.password == password)) {
            System.out.println("密码错误");
            return;
        }
        System.out.println("登录成功");
    }
}
public class Test {
    public static void main(String[] args) {
        SignIn signIn = new SignIn();
        signIn.confirm("aaa",123);
    }
}


缺陷:正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱。


4.2 事后认错型

事后认错型:也就是先操作, 遇到问题再处理

public class Test {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (ArithmeticException e) {
            System.out.println("出现算术异常");
        }
        System.out.println("程序继续执行");
    }
}

运行结果:


哇.png


优势:正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码


在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws  


相关文章
|
7天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
7天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
8天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
9天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
12天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
13 1
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
21天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
23天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
24天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
31 2
|
28天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。