[java进阶]——异常详解,try catch捕获异常,抛出异常

简介: [java进阶]——异常详解,try catch捕获异常,抛出异常

一、异常的体系结构

分析:

Error:表示JVM无法恢复的严重错误的Throwable子类。这些错误通常是由于系统资源不足、类文件损坏或其他无法控制的情况下发生的。例如,OutOfMemoryError表示JVM无法分配所需的内存量;StackOverflowError表示JVM在执行无限递归时耗尽了堆栈空间。

Exception:Throwable的另一个子类,表示程序可能能够处理的异常情况。按类分为编译异常和运行异常

Error我们无法处理

Exception异常处理方式有三种:1.默认交给虚拟机处理 2.捕获异常 3.抛出异常

二、处理异常的本质

一句话:提高健壮性与可靠性

你想,如果你想录入一个年龄,你要进行合法值判断,否则你就可能出现活了18.4年,-10年这样的情况,而编译器会认为这个年龄是正确的,继续运行后面的程序会发生意想不到的后果,只不过这些异常是其他形式的异常,例如数组越界,空指针,文件不存在等等。

运行异常:运行异常通常是由程序员自身编写代码不规范引起的,比如数组越界、空指针。这些异常通常我们不会捕获,因为这些异常时可以通过提升你的代码质量来消除的。

编译异常:编译时发生的异常,通常是程序员的错误,或者外部环境错误,例如变量没定义就使用,没有找到你要引用的库文件等等,这些异常通常使用try catch捕获或抛出。

三、异常处理的三种方式

3.1虚拟机jvm处理(默认)

将异常信息打印到控制台,并直接终止程序。

3.2 try catch捕获异常

原理分析

try代码块里发生异常会自动创建一个异常对象,不会执行try代码块中异常后面的代码,直接到catch里面寻找,如果catch捕获了该异常,就执行catch里面的代码,再执行try-catch后续代码,如果没有捕获,交给虚拟机处理(第一种方式)。

注意:异常可以被继承,所以捕获父类异常一定要写到最后

try-catch的灵魂四问:

一问:如果try中没有遇到问题,会怎么执行

二问:如果try中遇到多个问题,怎么执行

三问:如果try中遇到问题没有被捕获,怎么执行

四问:如果try中遇到了问题,那么try后的代码还会执行吗

上才艺:

try中没有遇到问题,会执行try-catch后面的代码

try遇到多个问题,会处理第一个异常(找catch),并且try后面的代码不会执行,如果没有捕获交给虚拟机处理

应用场景:

try{
            System.out.println(arr[4]);//数组越界
            //System.out.println("aaaaaaa");
            int a = 10/0;//算数异常
        }catch (IndexOutOfBoundsException e){
            System.out.println("索引越界异常");
        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }catch (Exception e){
            //异常的父类 一定要放到最后,
            //如果放到了前面
            //什么异常都会被捕获
            System.out.println("发生异常~~");
        }
        System.out.println("看看我执行了嘛~~");
3.3抛出异常

throw:写在方法内,结束方法,后续代码不会执行,告诉调用者是什么异常

throws:写在方法定义处,表示声明一个异常,告诉调用者,该方法可能出现哪些异常

编译异常必须要写,运行异常可以不写

private static int getSum(int[] arr) throws NullPointerException {
        //可能为null指针吧
        if(null == arr){
            //抛出异常 结束方法 不会执行下面的语句
            throw new NullPointerException();
        }
        System.out.println("看看我执行了嘛~~");
        //正常计算求和
        int total = 0;
        for (int i = 0; i < arr.length; i++) {
            total += arr[i];
        }
        return total;
    }

抛出问题的三种方法:

1.getmessage,返回throwable字符串

2.throw e 抛出异常

3.e.printStackTrace()将错误以红色字体打印在控制台 最常用

int[] arr = {1,2,3};
        try {
            arr[6] = 10;
        } catch (ArrayIndexOutOfBoundsException e) {
//            //getmessage方法 返回 throwable 消息字符串
//            String message = e.getMessage();
//            System.out.println(message);
//            tostring返回问题的简短描述
//            System.out.println(e.toString());
            //将错误以红色字体打印在控制台 最常用的
//            并且继续执行下面的语句
//            包含信息最多
//            什么异常 异常的信息 异常的位置
//            e.printStackTrace();
            //扔给方法的调用处
            throw e;
        }
3.4finally关键字

finally修饰的代码块总会被执行

try{
…………
}catch(){}……
finally{
    //总会被执行
}

四、自定义异常

我们可以自己定义异常以便更好的调试程序

如何书写:

①写继承关系②空参和带参构造

应用场景:

当我们在键盘录入姓名年龄时,以前我们会打印一个提示信息,这还不够明确,现在我们直接抛出异常,这个异常信息我们就可以自定义。

public void setAge(int age) {
        if(age > 40 || age < 18){
            throw new NameFormatException(age + "年龄格式错误,应18~40");
        }
        this.age = age;
    }
//定义异常
public class AgeOutOfBoundException extends RuntimeException{
//空参构造
    public AgeOutOfBoundException() {
    }
//带参构造
    public AgeOutOfBoundException(String message) {
        super(message);
    }
}

五、总结

try-catch的执行原理

什么是编译异常,什么是运行异常,请举例

有继承关系的catch语句,捕获父类异常一定放到最后

finally关键字的作用

throw与throws的区别

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