JAVA异常处理(三种异常处理机制)

简介: 异常是程序在编译或执行的过程中可能出现的问题,语法错误不算在异常体系提前处理异常,程序会更加安全Error: 系统级别问题、JVM退出等,代码无法控制Exception: Java.lang包下,称为异常类,它表示程序本身可以处理的问题 Runtime Exception及其子类: 运行时异常,编译阶段不会报错(如空指针,数组索引越界异常) 除Runtime Exception之外所有异常:

目录

前言

一、异常体系

二、异常示例

1.运行时异常

2.编译时异常

三、异常处理

1.默认异常处理

2.异常处理1 & throws

3.异常处理2  & try . . . catch . . .

4.异常处理3 & 前面两者的结合

5.运行时异常的处理

四、自定义异常

自定义编译时异常

总结


前言

异常是程序在编译执行的过程中可能出现的问题,语法错误不算在异常体系

提前处理异常,程序会更加安全


一、异常体系

image.gif

Error:

       系统级别问题、JVM退出等,代码无法控制

Exception:

       Java.lang包下,称为异常类,它表示程序本身可以处理的问题

       Runtime Exception及其子类:

               运行时异常,编译阶段不会报错(如空指针,数组索引越界异常)

       除Runtime Exception之外所有异常:

               编译时异常,编译期必须处理的,否则程序不能通过编译(如日期格式化)

 


二、异常示例

1.运行时异常

编译阶段不会报错,运行时才会提示错误

public static void main(String[] args) {
    //数组索引越界异常:ArrayIndexOutOfBoundsException
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]);
    //空指针异常:NullPointerException,直接输出没问题,但是调用空指针的变量功能就会报错
    String name = null;
    System.out.println(name);          //可以输出
    System.out.println(name.length()); //报错
    //类型转换异常:ClassCastException
    Object o = 12;
    String s = (String) o;
    //数学操作异常:ArithmeticException
    int c = 10/0;
    //数字转换异常:NumberFormatException
    String number = "a2";
    Integer i = Integer.valueOf(number);
}

image.gif

2.编译时异常

编译阶段就报错,必须要处理

如下图,日期解析异常

image.gif


三、异常处理

1.默认异常处理

通常我们不对代码可能出现的异常进行处理,Java就会默认处理我们的异常,如下:

默认会在出现异常的代码处,自动创建一个异常对象:ArithmeticException

异常会从方法中出现的抛给调用者,调用者抛给JVM虚拟机

虚拟机收到异常对象后,先在控制台输出异常栈信息数据

直接从出现异常的地方关闭程序

2.异常处理1 & throws

添加throws ***到方法签名

规范写法throws Exception

将方法内部出现的异常抛给本方法调用者

throws仅仅是将函数中可能出现的异常向调用者声明,而自己则不具体处理。

       throws声明:如果一个方法内部的代码会抛出检查异常(checked exception),而方法自己又没有完全处理掉或并不能确定如何处理这种异常,则javac保证你必须在方法的签名上使用throws关键字声明这些可能抛出的异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理,否则编译不通过。

public static void main(String[] args) throws ParseException {
    parseTime("2015-10-10 10:10:10");
    }
    public static void parseTime(String data) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
        Date d = sdf.parse(data);
    }

image.gif

3.异常处理2  & try . . . catch . . .

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理

发生异常的方法自己独自完成异常处理,程序还能继续往下执行

image.gif

public static void main(String[] args)  {
parseTime("2015-10-10 10:10:10");
}
public static void parseTime(String data)  {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
        Date d = sdf.parse(data);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

image.gif

4.异常处理3 & 前面两者的结合

方法将异常通过throws抛给调用者,调用者收到异常后捕获处理。

public static void main(String[] args)  {
    try {
        parseTime("2015-10-10 10:10:10");
        System.out.println("成功");
    } catch (ParseException e) {
        e.printStackTrace();
        System.out.println("失败");
    }
}
public static void parseTime(String data) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
    Date d = sdf.parse(data);
}

image.gif

5.运行时异常的处理

可以不进行处理,编译阶段不会报错,但建议处理,在最外层捕获

public static void main(String[] args) {
  System.out.println("开始");
    try {
        int d = 10/0;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    System.out.println("结束");
}

image.gif


四、自定义异常

JAVA无法为所有的问题提供异常类,如果企业想通过异常的方式来管理某个业务问题,就需要自定义异常类了。

按照国际惯例,自定义的异常应该总是包含如下的构造函数:

               一个无参构造函数

               一个带有String参数的构造函数,并传递给父类的构造函数。

               一个带有String参数和Throwable参数,并都传递给父类构造函数。

               一个带有Throwable 参数的构造函数,并传递给父类的构造函数。

注意:如果自定义异常是为了提示,在使用的时候,一定要用try..catch,不要直接用throw往外抛。

自定义编译时异常

定义一个异常类继承Exception

重写构造器

public class Ageilleagaleception  extends Exception{
    public Ageilleagaleception (){
    }
    public Ageilleagaleception(String message){
        super(message);
    }
}

image.gif

在出现异常的地方用throw new自定义对象抛出

public static void checkAge(int age) throws Ageilleagaleception {
        if(age < 0 || age > 200){
            throw new Ageilleagaleception(age+"is illegal");
        }else {
            System.out.println("年龄正确");
        }
    }

image.gif

自定义运行时异常

定义一个类继承RuntimeException

重写构造器

在出现异常的地方用throw new自定义对象抛出


总结

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常

异常处理不能替代简单的测试,不要过分的细化异常

目录
相关文章
|
2月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
14天前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
34 4
|
2月前
|
Java
Java 异常处理:11 个异常处理最佳实践
本文深入探讨了Java异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理异常、不忽略异常、抛出具体异常、正确包装异常、记录或抛出异常但不同时执行、不在finally中抛出异常、避免用异常控制流程、使用模板方法减少重复代码、抛出与方法相关的异常及异常处理后清理资源等内容,旨在提升代码质量和可维护性。
134 3
|
2月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
145 1
|
2月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
67 2
|
2月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
70 2
|
2月前
|
Java 开发者
Java 中的异常处理:不仅仅是 try-catch
在Java的世界里,异常处理是代码的守护神,它保护着程序不会因为意外错误而崩溃。但异常处理远不止try-catch那么简单。本文将深入探讨Java的异常处理机制,从基本的try-catch到更复杂的自定义异常和finally块的使用,带你理解如何在Java中优雅地处理错误。
63 1
|
2月前
|
Java API 开发者
深入理解Java中的异常处理机制
本文探讨了Java编程语言中异常处理的核心概念,包括异常类型、异常捕获与抛出、以及最佳实践。通过分析常见的异常场景和处理策略,旨在帮助开发者更好地理解和运用异常处理机制,提高代码的健壮性和可维护性。文章不仅涵盖了基本的try-catch结构,还深入讨论了自定义异常的创建与使用,以及finally块的重要性和应用。此外,还将介绍一些高级技巧,如多异常捕获和嵌套异常处理,为读者提供全面的技术指导。
108 0
|
3月前
|
设计模式 Java 开发者
Java中的异常处理:理解与实践
【10月更文挑战第42天】在Java的世界中,异常处理是每个开发者必须面对的挑战。它就像是一场不可预知的风暴,可能会在任何时候突然降临,打乱我们的计划。但是,如果我们能够掌握正确的处理方法,这场风暴也可以变成推动我们前进的力量。本文将带你深入理解Java中的异常处理机制,通过代码示例,我们将一起学习如何捕获、处理和预防异常,让你的程序在面对任何挑战时都能保持稳健和优雅。
|
2月前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
43 5