Java中基于Exception类的异常以及异常处理

简介: 你真的理解异常吗?

@TOC

前言

异常和break有一点点类似,都可以让程序停止运行。异常的发生和人生病是一个道理,处理异常就是看病过程的一种抽象形式,异常处理保证了程序的健壮性,在以后的开发过程中有着举足轻重的作用。当我深入了解异常,发现原来每一种异常都是一个一个进行封装过的类,他们也存在着继承关系。其实,异常也是面向对象特性的一种体现!

一.异常分类

异常(Exception):因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
异常分为==运行异常==和==编译异常==

在这里插入图片描述

可以看到,==异常体系其实是一个继承关系==,常见的各种异常都是父类Exception的实现子类,而类所具有的特征Exception类也同样具有,所以我们可以通过实例化异常类的方式来设计异常

二.常见运行异常与编译异常

编译异常:(程序员写代码过程中提示出来的异常)
==SQLException== 操作数据库时,查询表可能发生异常
==IOException== 操作文件时,发生的异常
==FileNotFoundException== 当操作一个不存在的文件时,发生异常
==ClassNotFoundException== 加载类,而该类不存在时,异常
==EOFException== 操作文件,到文件末尾,发生异常
==IllegalArguementException== 参数异常
运行异常:(程序运行时报错显示的异常)
==NullPointerException==空指针异常
==ArithmeticException==数学运算异常
==ArraylndexOutOfBoundsException==数组下标越界异常
==ClassCastException==类型转换异常
==NumberFormatException==数字格式不正确异常[]

三.异常处理

我们都知道,当程序遇到异常时会终止,在大项目的开发中,很难做到不犯任何错误。设想:如果以后开发的大项目出了一点错误就不能运行,那程序的健壮性太差!这就好比一个男人经受一点风吹雨打就卧床不起,太不应该。以下是几种常见的处理异常的方式,使用时选择其中一种就可!

1.try-catch-finally(🚩)

所以Java设计者们设计了==异常处理机制==,这就好比在给程序打补丁,兜底。
语法:

try {
 可能发生异常的代码...
   }catch(异常) {  //捕获到异常
 //处理
  }finally{
//始终要执行的代码
  }

==注意事项:==

🟢当异常发生时系统将异常封装成Exception对象e,传递给catch
🟢得到异常对象后,程序员,自己处理
🟢如果没有发生异常catch代码块不执行
🟢使不管try代码块是否有异常发生,始终要执行finally(所以,通常将释放资源的代码,放在finally部分)
 public static void main(String[] args) {
        try {
            String a = "彭于晏";
            int b = Integer.parseInt(a);  //这里会出现异常
        } catch (Exception e) {
//            e.printStackTrace();
            System.out.println("异常信息:"+e.getMessage());
        }finally{
            System.out.println("finally代码块被执行");
        }
        System.out.println("程序继续~~~");
    }

▶️运行结果:
在这里插入图片描述
我们看到,在程序出现异常的情况下依然完整执行,并且给出了异常内容,这就是机制的妙处所在

🟢可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后, NullPointerException在前),如果发生异常,只会匹配一个catch:

例如:
在对输入的参数转换为整数并进行除法运算的过程中,会出现很多异常,要根据不同的输入,输出对应的异常,这个需求就体现多个catch语句的好处

public class Play {
    public static void main(String[] args) {
            try{
                Scanner scanner=new Scanner(System.in);
                String str1=scanner.next();
                String str2=scanner.next();
                int n1 = Integer.parseInt(str1);
                int n2 = Integer.parseInt(str2);
                double res=cal(n1,n2);//该方法可能抛出ArithmeticException
                System.out.println("计算结果是:"+res);
            }catch (NumberFormatException e) {
                System.out.println("输入参数格式不正确,重新输入");
            }catch(ArithmeticException e){
                System.out.println("出现了除0的异常~");
            }catch(Exception e){            //这个必须写在子类异常后
                System.out.println("出现了异常~");
            }
        }
        public static double cal(int n1, int n2) {
            return n1 / n2;
        }
}

▶️运行结果:
==ArithmeticException==异常
在这里插入图片描述
==NumberFormatException==异常在这里插入图片描述
==根据不同用户的输入,抛出相应的异常这就是try-catch机制的一个重要作用!==

**try-catch-finally执行顺序:
1.当未出现异常时:执行try块中的所有语句,不执行catch块中的语句,如果有finally,最后要执行finally块中的语句
2.出现异常时:try块中的异常发生后,try块中剩下的语句不再执行,将执行catch块中的语句,同理如果有finally,最后要执行finally块里的语句**

2.throws(🚩)

==throws(抛出)==:在代码中理解成一种抛出难题的行为,它的作用是通过把异常抛给别的类或者方法让当前的部分不受该异常的影响
在这里插入图片描述
==throws注意事项:==
🟢存在继承关系的两个类,子类重写父类方法时,所抛出的异常类型要么和父类抛出异常类型一致,要么为父类抛出的异常类型的子类型
例如:

class Father{
    public void f1() throws Exception{...}
}
class Son extends Father{
    @Override
    public void f1() throws RuntimeException {...}   //或者抛出Exception
}

🟢调用存在异常的方法时要处理他的异常,否则会报错,若是运行异常可以不用显式处理
例如:

class A{
    public static void f4() throws FileNotFoundException{
       try {   
            f3();
       } catch (FileNotFoundException e) {
            e.printStackTrace();
    }
}
    public static void f3() throws FileNotFoundException {   //抛出一个编译异常
        FileInputStream fis=new FileInputStream("xxx");
    }
}

处理的方式可以是try-catch也可以是throws
🟢可以直接访问同类中抛出运行异常的方法,因为==运行异常会被java默认处理==
例如:

class B{
    public static void f5(){
        f6();
    }
    public static void f6() throws ArithmeticException{}
}

3.try-finally

这个用法相当于没有捕获异常,程序会崩掉

try{
   可能出现异常的代码
  }finally{
  总是执行的代码
 }

四.自定义设计异常

我们可以通过继承Exception类的方式来自定义异常,一般情况下,我们自定义异常是继承RuntimeException(运行异常)
即把自定义异常做成运行时异常,好处是我们可以使用Java默认的处理机制!!!

例如:
自定义一个异常类通过实例化它,向构造器中传入自己定义的字符来初始化,达到程序员自定义输出异常内容的目的

public class CustomException {
    public static void main(String[] args) {
        //要求输入一个年龄在18-120,否则抛出一个异常
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入年龄:");
        double age= scanner.nextInt();
        if(!(age>=18&&age<=120)){  
            throw new AgeException("您输入的年龄有误!");
        }
        System.out.println("你的年龄符合~");
    }
}
//自定义一个异常
class AgeException extends RuntimeException{   //继承运行异常 便于处理
    public AgeException(String message) { //构造器
        super(message);
    }
}

▶️运行结果:
在这里插入图片描述

相关文章
|
1天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
3天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
3天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
1天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
7 2
|
2天前
|
Java 程序员 开发者
Java编程中的异常处理艺术
【10月更文挑战第24天】在Java的世界里,代码就像一场精心编排的舞蹈,每一个动作都要精准无误。但就像最完美的舞者也可能踩错一个步伐一样,我们的程序偶尔也会遇到意外——这就是所谓的异常。本文将带你走进Java的异常处理机制,从基本的try-catch语句到高级的异常链追踪,让你学会如何优雅地处理这些不请自来的“客人”。
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制####
本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
|
1天前
|
Java 程序员 UED
Java中的异常处理:从基础到高级
【10月更文挑战第25天】在Java的世界中,异常处理是维护程序健壮性的重要手段。本文将深入浅出地介绍Java异常处理的机制,从基本的try-catch-finally结构出发,逐步探讨更复杂的异常处理策略,如自定义异常、异常链以及如何利用异常处理提高代码的可读性和可维护性。通过具体示例,我们将看到如何优雅地处理异常,确保程序在面对不可预见的错误时仍能稳定运行。
4 1
|
3天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
11 3
|
4天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
3天前
|
Java 程序员 数据库连接
深入浅出Java异常处理
【10月更文挑战第23天】Java的异常处理机制是每个Java程序员必须掌握的基础技能,它不仅关系到程序的健壮性,还直接影响到代码的可读性和可维护性。通过本文,你将了解如何在Java中有效使用try-catch-finally语句块来捕获和处理异常,以及如何自定义异常类来处理特定情况。我们将一起探索异常处理的最佳实践,让你的代码在遇到问题时能够优雅地恢复或通知用户,而不是崩溃。
11 1