JavaSE——异常处理机制

简介: JavaSE——异常处理机制

文章目录

​1. 异常的概念与体系结构

  1. 异常的处理
  1. 总结

​1. 异常的概念与体系结构
1.1 异常的概念
什么是异常呢?

在java中,将程序执行过程中发生的不正常行为称为异常

java中不同类型的异常,都有与其对应的类来进行描述

接下来看看有哪些常见的异常:

  1. 算术异常

public class Test {

public static void main(String[] args) {
    System.out.println(10/0);
}

}

  1. 数组越界异常

public class Test {

public static void main(String[] args) {
    int[] arr = {0,1,2,3};
    System.out.println(arr[100]);
}

}

  1. 空指针异常

public class Test {

public static void main(String[] args) {
    int[] arr = null;
    System.out.println(arr.length);
}

}

  1. 输入不匹配异常

import java.util.Scanner;

public class Test {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    System.out.println(n);
}

}

 1.2 异常的体系结构

 1.3 异常的分类

  1. 编译时异常

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)

程序想要编译,必须处理异常后才能继续编译

class Person{

private String name;
private String gender;
int age;

    //想要让该类支持深拷贝,覆写Object类的clone方法即可
public Person clone(){
    return (Person)super.clone();
}

}

  1. 运行时异常
  1. 异常的处理

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

2.1 抛出异常throw
在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者。具体语法如下

throw new XXXException("异常产生的原因");
接下来我们写一个抛出异常的代码

public class Test {

public static void main(String[] args) {
    int[] arr = null;
    test(arr);

}
public static void test (int[] arrays){
    if(arrays == null){
        throw new NullPointerException("传递的数组为null");
    }
}

}

2.2 异常的捕获(throws 以及try-catch)
异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理

异常声明throws

语法格式:
修饰符 返回值 类型 方法名(参数列表) throws 异常类型1,异常类型2...{

    //...

}

public class Test {

public static void main(String[] args) throws Exception {
    int[] arr = null;
    test(arr);

}

public static void test(int[] arrays) throws Exception{
    if(arrays == null){
        throw new NullPointerException();
    }
}

}

try-catch捕获并处理

语法格式:

try {

        //将可能出现异常的代码放在这里
        //可能会抛出异常,也可能不会

}catch(要捕获的异常类型 e){

        //如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
        //对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码

}
注意事项:

  1. try块内抛出异常位置之后的代码将不会被执行

public class Test {

public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
        System.out.println("hello world");
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

}
没有输出hello world 

  1. 如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到JVM收到后中断程序----异常是按照类型来捕获的

抛出异常类型与catch时异常类型不匹配:

public class Test {

public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
        System.out.println("hello world");
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
}

}

  1. try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获----即多种异常,多次捕获

public class Test {

public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
        System.out.println("hello world");
    } catch (ArithmeticException e) {
        e.printStackTrace();
    } catch (NullPointerException e){
        e.printStackTrace();
    } catch (ArrayIndexOutOfBoundsException e){
        e.printStackTrace();
    }
}

}
多个异常的处理方式是完全相同, 也可以写成这样:

public class Test {

public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
        System.out.println("hello world");
    } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
        e.printStackTrace();
    } 
}

}
异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误

public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
        System.out.println("hello world");
    } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
        e.printStackTrace();
    } catch (Exception e){
        e.printStackTrace();
    }
}

Exception可以捕获到所有异常

finally
有些特定的代码,不论程序是否发生异常,都需要执行;在程序正常或者异常退出时,必须要对资源进进行回收;异常还可能会引发程序的跳转,可能导致有些语句执行不到,就需要用到finally这个关键字了

语法格式

try {

      //...
      

}catch(要捕获的异常类型 e){

        //...

}finally{

    //此处的语句无论是否发生异常,都会被执行到
    //如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行

}
public static void main(String[] args) throws Exception {

    try {
        int[] arr = null;
        System.out.println(arr[3]);
    } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
        e.printStackTrace();
    } finally {
        System.out.println("hello world");
    }
}


  1. 总结

        一个程序先执行 try 中的代码,如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配。如果找到匹配的异常类型,就会执行 catch 中的代码。如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者。无论是否找到匹配的异常类型,finally 中的代码都会被执行到(在该方法结束之前执行)。如果上层调用者也没有处理异常, 就继续向上传递直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理,此时程序就会异常终止。

相关文章
|
5月前
|
Java 编译器
Java中的异常处理机制详解
Java中的异常处理机制详解
|
2月前
|
Java 开发者
Java中的异常处理机制:理解与应用
在Java编程中,异常处理是一个重要的概念。它允许开发者通过检测和响应错误情况来增强程序的健壮性和可靠性。本文将深入探讨Java异常处理的基本概念、不同类型的异常以及如何使用try-catch-finally块来捕获和处理异常。我们还将讨论如何创建自定义异常类,并提供一些最佳实践来有效处理异常。通过阅读本文,您将能够更好地理解和应用Java中的异常处理机制,从而提高您的编程技能和代码质量。
|
4月前
|
Java 数据库连接 UED
java 异常处理机制
java 异常处理机制
33 1
|
4月前
|
Java UED 开发者
掌握Java中的异常处理机制
【8月更文挑战第24天】在Java编程的海洋中,异常处理是一块不可忽视的礁石。它既是挑战也是机遇——一个让你的程序避免沉没,同时提升用户体验的关键。本文将带你深入理解异常处理的核心概念,探索如何优雅地处理错误和异常,以及如何通过有效的异常处理策略来增强代码的健壮性和可读性。让我们开始这段旅程吧!
|
5月前
|
Java 程序员 API
JavaSE—异常处理深入了解(一)
JavaSE—异常处理深入了解(一)
|
7月前
|
Java UED
JavaSE&异常
JavaSE&异常
27 1
|
7月前
|
Java
java的异常处理机制
java的异常处理机制
|
7月前
|
Java 数据库连接
Java中的异常处理机制及其应用
【2月更文挑战第5天】异常处理是Java程序设计中非常重要的一部分。本文将介绍Java中的异常处理机制,包括异常的分类、捕获和处理方式。同时,还将探讨异常处理在实际开发中的应用,并给出一些实例代码。
|
监控 Java 程序员
|
Java 程序员
JavaSE 异常
JavaSE 异常
38 0