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 一定抛出了某种异常


相关文章
|
12天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
12天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
15天前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
26天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
36 5
Java反射机制:解锁代码的无限可能
|
13天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
14天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
14天前
|
Java 数据库连接 开发者
Java中的异常处理机制及其最佳实践####
在本文中,我们将探讨Java编程语言中的异常处理机制。通过深入分析try-catch语句、throws关键字以及自定义异常的创建与使用,我们旨在揭示如何有效地管理和响应程序运行中的错误和异常情况。此外,本文还将讨论一些最佳实践,以帮助开发者编写更加健壮和易于维护的代码。 ####
|
17天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
14 1
|
19天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
40 2
下一篇
无影云桌面