Java核心类库之(异常机制)

简介: 黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程

以下博客是根据黑马视频写的Javase全集博客笔记:黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程


(一)Java语言基础

(二)Java面向对象编程

(三)Java核心类库之(常用API、字符串类、集合类、泛型)

(四) Java核心类库之(异常机制)

(五)Java核心类库之(字符集/编码集、File类、递归、IO流:字节流、字符流、特殊操作流)

(六)Java核心类库之(类加载器、反射机制、模块化)

(七)Java核心类库之(Lambda表达式)

(八)Java核心类库之(接口组成更新、方法引用、函数式接口)

(九)Java核心类库之(Stream流:生成、中间、终结、收集操作)

(十)Java核心类库之(多线程:实现多线程、线程同步)

(十一)Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)


1 异常

1.1 异常的概述

异常:就是程序出现了不正常的情况

image.png


Error:严重问题,不需要处理


Exception:称为异常类,它表示程序本身可以处理的问题


RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码


非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了


1.2 常见异常类型

数组索引越界异常:ArrayIndexOutOfBoundsException

空指针异常:NullPointerException;直接输出没有问题,但是调用空指针的变量的功能就会报错

类型转换异常:ClassCastException

迭代器遍历没有此元素异常:NoSuchElementException

数学操作异常:ArithmeticException

数子转换异常:NumberFormatException

1.3 JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终 JVM 会做默认处理

把异常的名称、异常的原因以及异常出现的位置等信息输出在控制台

有异常的位置程序停止运行

1.4 编译时异常的处理方式

如果程序出现了问题,我们需要自己来处理,有两种处理方案

try … catch …

throws

1.4.1 异常处理之 try … catch … [kætʃ](捕获异常)

格式1

try {
  可能出现异常的代码;
} catch (异常类名 变量名) {
  异常的处理代码;
} /*catch (异常类名1 变量名1) {
  异常的处理代码;
}*/

格式二

try{
    可能出现异常的代码;
} catch(Exception e){
    e.printStackTrae(); //返回异常信息
}

执行流程:


程序从 try 里面的代码开始执行

出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统

当Java运行时系统接收到异常对象时,会到 catch 中 去找匹配的异常类,找到后进行异常处理

执行完毕之后,程序还可以继续往下执行

范例


package ceshi;
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }
    public static void method() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]); //出现异常时,会创建一个异常对象new ArrayIndexOutOfBoundsException();
        } catch (ArrayIndexOutOfBoundsException/Exception e) {
            e.printStackTrace();
            /*开始
            结束
            java.lang.ArrayIndexOutOfBoundsException: 3
            at ceshi.ExceptionDemo.method(ExceptionDemo.java:12)
            at ceshi.ExceptionDemo.main(ExceptionDemo.java:6)*/
        }
    }
}

1.4.2 异常处理之 throws(抛出异常)

格式

throws 异常类名; 

注意:这个格式是跟在方法的括号后面的

编译时异常必须要进行处理,两种处理方案:try … catch… 或者 throws,如果采用 throws 这种方案,将来还是需要调用try … catch …

运行时异常可以不处理,出现问题后,需要我们会来改代码

package ceshi;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
    public static void main(String[] args)  {
        System.out.println("开始");
//        method();
        try {
            method2();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }
    //编译时异常
    public static void method2() throws ParseException {
        String s = "2020-7-16";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s); //parse报错:ParseException
        System.out.println(d); //Thu Jul 16 00:00:00 CST 2020
    }
    //运行时异常
    public static void method() throws Exception{
        int[] arr = {1,2,3};
        System.out.println(arr[3]);
        /*开始
        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at ceshi.ExceptionDemo.method(ExceptionDemo.java:28)
        at ceshi.ExceptionDemo.main(ExceptionDemo.java:9)*/
    }
}

1.5 Throwable 的成员方法

方法名 说明

public String getMessage() 返回此 throwable 的详细信息字符串

public String toString() 返回此可抛出的简短描述

public void printStackTrace() (常用) [treɪs] 把异常的错误信息输出在控制台

package ceshi;
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }
    public static void method() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]); //出现异常时,会创建一个异常对象new ArrayIndexOutOfBoundsException();
        } catch (ArrayIndexOutOfBoundsException e) {
            //1,public String getMessage()  返回此 throwable 的详细信息字符串
            System.out.println(e.getMessage()); //Index 3 out of bounds for length 3
            //2,public String toString()  返回此可抛出的简短描述
            System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: 3
            //3,public void printStackTrace() (常用)  把异常的错误信息输出在控制台
            e.printStackTrace();
            /*java.lang.ArrayIndexOutOfBoundsException: 3
            at ceshi.ExceptionDemo.method(ExceptionDemo.java:12)
            at ceshi.ExceptionDemo.main(ExceptionDemo.java:6)*/
        }
    }
}

1.6 编译时异常和运行时异常的区别

Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常

运行时异常就是运行时才报错,编译时异常就是编译时有红线报错

RuntimeException类及其子类(运行时异常):无需显示处理,也可以和编译时异常一样处理

其余异常(编译时异常):必须显示处理,否则程序就会发生错误,无法通过编译(有可能会出现异常,并不是一定会出现)

1.7 finally关键字

用在捕获处理的异常格式中,放在最后面

格式

try{
    //可能出现异常的代码!
}catch{Exception e}{
    e.printStackTrace();
}finally{
    // 无论代码是出现异常还是正常执行,最终一定要执行这里的代码!!
}

finally的作用:可以在代码执行完毕后进行资源的释放操作


资源都是实现了Closeable接口的,都自带close()关闭方法


try : 出现1次

catch:出现0 - N 次(如果有finally那么 catch 可以没有)

finally:出现0 - 1 次

1.8 自定义异常

格式

public class 异常类名 enxtends Exception {
  无参构造
  带参构造
} 

异常类

package ceshi;
public class ScoreException extends Exception{
    //自动生成无参,带参构造方法
    public ScoreException() { }
    public ScoreException(String message) {
        super(message);
    }
}

操作类

package ceshi;
public class Teacher {
    public void checkScore(int score) throws ScoreException {
        if(score<0 || score>100) {
            throw new ScoreException("你给的分数有误");
        } else {
            System.out.println("成绩正常");
        }
    }
}

测试类

package ceshi;
import java.util.Scanner;
public class Demo {
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入分数"); 
        int score = sc.nextInt(); //120
        Teacher t = new Teacher();
//        t.checkScore(score); //checkScore报错,编译时异常需要捕获
        try {
            t.checkScore(score);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.9 throws 和 throw 的区别

throws的特点:


用在方法声明后面,跟的是异常类名

表示抛出异常,由该方法的调用者来处理

表示出现异常的一种可能性,并不一定会发生这些异常

throw的特点:


用在方法体内,跟的是异常对象名

表示抛出异常,由方法体内的语句处理

执行 throw 一定抛出了某种异常


相关文章
|
2月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
95 1
|
2月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
140 12
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
117 2
|
2月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
54 1
|
1月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
143 1
|
1月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
66 2
|
1月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
67 2
|
1月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
73 4
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
136 5