Java异常及其处理(超全讲解)

Java中的异常是指在程序运行时发生的一些错误或者异常情况。这些异常可能是由于编程错误、系统错误或者用户输入错误等引起的。为了让程序更加健壮和容错,Java提供了异常处理机制,允许程序在发生异常时进行捕获、处理和恢复。

 异常的分类:Java中异常分为两类,一类是运行时异常,另一类是非运行时异常。

 运行时异常可以在代码编写时不用显式地处理,因为Java虚拟机会自动进行处理。而非运行时异常则必须在代码中进行显式的处理,否则会导致程序的终止。

  1. 运行时异常 运行时异常是指那些可能在代码执行期间发生的异常,如数组越界、空指针引用等。这些异常不需要程序员在代码中显式地进行处理,因为Java虚拟机会自动进行处理。
  2. 非运行时异常 非运行时异常是指那些不是在代码执行期间发生的异常,如IOExceptionSQLException等。这些异常必须在代码中进行显式的处理,否则会导致程序的终止。 

Java中异常的处理主要包括三个关键字:

try、catch、finally。try块中包含可能会出现异常的代码,catch块中处理异常,finally块中释放资源。

  1. try-catch语句块 try{ //可能会出现异常的代码 }catch(Exception e){ //处理异常的代码 }

try代码块包含可能会抛出异常的代码,当异常发生时,程序会跳转到相应的catch代码块中,进行异常处理。

遇到困难不要怕,放手去try然后catch吧!!!( /^ω^)/♪♪

try-catch语句块

举个例子: 

public class Review_exception {
    public static void main(String[] args) {
        method();
    }


    public static void method() {
        int a = new Scanner(System.in).nextInt();
        int b = new Scanner(System.in).nextInt();
        System.out.println(a / b);
    }

}

(上图中定义了一个静态方法 method(),其中通过 Scanner 类从标准输入读取两个整数 ab,然后将它们相除的结果输出到标准输出。)

我们先搞出一个异常看看。

2/0 将0作为除数

抛出 java.lang.ArithmeticException 异常(异常的名称/类型)

异常的原因 /by zero 

异常的位置(java:12 java:5)可以帮助开发者快速定位问题所在。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(ArithmeticException aaa){
            System.out.println("除数不能为0");
        }
    }
}

再次提醒格式!//try里面放出现异常的代码

//catch圆括号里放异常类型及名称

//catch花括号里面放你的处理方式

在这个修正后的代码中,我们将method()方法中的try-catch语句进行了修正。try代码块中包含需要捕获异常的代码,即通过Scanner类从标准输入读取两个整数,然后进行除法运算。如果运算过程中出现除数为零的情况,就会抛出ArithmeticException异常,此时程序会跳转到catch代码块中,输出一条提示信息。

 

如果我们觉得异常的类型也太多了,就可以用所有异常类的超类Exception,

因此使用Exception作为catch块的参数可以处理所有可能出现的异常。这也是多态的一个应用,即在catch块中不关心子类的类型,只要是Exception异常都可以被接收和处理。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(Exception aaa){
            System.out.println("除数不能为0");
        }
    }

printStackTrace()方法

Java中的Throwable类提供了一个printStackTrace()方法,可以打印出异常的完整堆栈信息,包括异常的类型、消息、异常出现的位置以及异常发生时调用栈的信息。这个方法会在控制台输出异常的完整信息,便于我们查看异常的类型和异常发生时的调用栈,从而更好地定位和解决问题。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(Exception aaa){
            System.out.println("除数不能为0");
            aaa.printStackTrace();
        }
    }

如图,在控制台输出了异常的完整信息!

finally语句块

在Java中,finally语句块用于定义一段无论是否发生异常都需要执行的代码。通常,我们将需要在程序结束前进行清理工作的代码放在finally语句块中,以确保这些代码在任何情况下都会被执行。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);
           }
    catch(Exception aaa){
            System.out.println("除数不能为0");
        }finally{
            System.out.println("释放资源");
        }
    }

finally语句块的执行流程如下:

  1. 如果try语句块中发生了异常,Java虚拟机会跳过try语句块中的剩余代码,转而执行finally语句块中的代码。这可以用于进行资源的释放、清理等工作,以确保程序的正确性。
  2. 如果try语句块中没有发生异常,Java虚拟机也会执行finally语句块中的代码。这是因为finally语句块中的代码可能会包含一些必要的操作,比如关闭文件、释放资源等。
  3. finally块中的代码会在try块中的代码执行完毕后无论是否抛出异常都会被执行。如果finally块在catch块之前,当try块中的代码抛出异常时,程序就会直接跳转到finally块中执行,而不是执行catch块中的代码。这样会导致catch块中的代码无法执行,无法对异常进行处理。

总之流程就是:

  1. try失败了,马上转移到catch块,catch块完成后进行finally块。
  2. try成功了,跳过catch块,直接进行finally块
  3. 如果try块和catch块有return指令,finally还是会执行。

总之,finally语句块是用来执行一些必须要做的操作,无论是否出现异常,都会被执行。因此,finally语句块通常被用来进行资源的释放、清理等操作,以保证程序的正确性和可靠性。

抛出异常

在Java中,抛出异常通常用于表示程序运行时出现的异常情况,例如参数错误、文件不存在、网络连接失败等等。如果程序遇到这些异常情况,可以通过抛出异常来通知调用者,让调用者进行相应的处理。

具体格式:

public class Review_exception {
    public static void main(String[] args) throws Exception {
        method2();
    }

    public static void method2() throws Exception{
            int a = new Scanner(System.in).nextInt();//异常代码
                 int b = new Scanner(System.in).nextInt();//异常代码
                 System.out.println(a / b);//异常代码
              }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2章:简单Java程序】_简单Java程序笔记.pdf 010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与方法】_数组的定义及使用笔记.pdf 010402_【第4章:数组与方法】_方法的声明及使用笔记.pdf 010403_【第4章:数组与方法】_数组的引用传递笔记.pdf 010404_【第4章:数组与方法】_Java新特性对数组的支持笔记.pdf 020501_【第5章:面向对象基础】_面向对象、类与对象的定义笔记.pdf 020502_【第5章:面向对象基础】_类与对象的进一步研究笔记.pdf 020503_【第5章:面向对象基础】_封装性笔记.pdf 020504_【第5章:面向对象基础】_构造方法与匿名对象笔记.pdf 020505_〖第5章:面向对象基础〗_实例讲解—类设计分析(学生类)笔记.pdf 020506_【第5章:面向对象基础】_String类笔记.pdf 020507_【第5章:面向对象基础】_String类的常用方法.pdf 020508_【第5章:面向对象基础】_引用传递及其应用笔记.pdf 020509_【第5章:面向对象基础】_this关键字笔记.pdf 020510_【第5章:面向对象基础】_static关键字笔记.pdf 020511_【第5章:面向对象基础】_理解main方法笔记.pdf 020512_【第5章:面向对象基础】_代码块笔记.pdf 020513_【第5章:面向对象基础】_构造方法私有化笔记.pdf 020514_【第5章:面向对象基础】_对象数组笔记.pdf 020515_【第5章:面向对象基础】_内部类笔记.pdf 020516_〖第5章:面向对象基础〗_实例讲解—系统登陆笔记.pdf 020517_〖第5章:面向对象基础〗_实例讲解—单向链表(1)笔记.pdf 020518_〖第5章:面向对象基础〗_实例讲解—单向链表(2)笔记.pdf 020601_【第6章:面向对象(高级)】_继承的基本实现笔记.pdf 020602_【第6章:面向对象(高级)】_继承的进一步研究笔记.pdf 020603_〖第6章:面向对象(高级)〗_范例:继承的应用笔记.pdf 020604_【第6章:面向对象(高级)】_final关键字笔记.pdf 020605_【第6章:面向对象(高级)】_抽象类的基本概念笔记.pdf 020606_【第6章:面向对象(高级)】_接口的基本概念笔记.pdf 020607_【第6章:面向对象(高级)】_对象的多态性笔记.pdf 020608_【第6章:面向对象(高级)】_instanceof关键字笔记.pdf 020609_【第6章:面向对象(高级)】_抽象类与接口的应用笔记.pdf 020610_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记.pdf 020611_【第6章:面向对象(高级)】_Object类笔记.pdf 020612_【第6章:面向对象(高级)】_包装类笔记.pdf 020613_【第6章:面向对象(高级)】_匿名内部类笔记.pdf 020701_【第7章:异常的基本概念】_异常的基本概念笔记.pdf 020702_【第7章:异常的基本概念】_异常的其他概念笔记.pdf 020801_【第8章:包及访问控制权限】_包的定义及导入笔记.pdf 020802_【第8章:包及访问控制权限】_访问控制权限及命名规范笔记.pdf 030901_【第9章:多线程】_认识多线程笔记.pdf 030902_【第9章:多线程】_线程常用操作方法笔记.pdf 030903_〖第9章:多线程〗_线程操作范例笔记.pdf 030904_【第9章:多线程】_同步与死锁笔记.pdf 030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记.pdf 030906_【第9章:多线程】_线程生命周期笔记.pdf 031001_【第10章:泛型】_泛型入门笔记.pdf 031002_【第10章:泛型】_通配符笔记.pdf 031003_【第10章:泛型】_泛型的其他应用笔记.pdf 031004_〖第10章:泛型〗_实例讲解—泛型操作范例笔记.pdf 031101_【第11章:Java常用类库】_StringBuffer笔记.pdf 031102_【第11章:Java常用类库】_Runtime类笔记.pdf 031103_【第11章:Java常用类库】_国际化程序笔记.pdf 031104_【第11章:Java常用类库】_System类笔记.pdf 031105_【第11章:Java常用类库】_日期操作类(Date、Calendar)笔记.pdf 031106_【第11章:Java常用类库】_日期操作类(DateFormat、SimpleDateFormat)笔记.pdf 031107_〖第11章:Java常用类库〗_实例操作:取得当前日期笔记.pdf 031108_【第11章:Java常用类库】_Math与Random类笔记.pdf 031109_【第11章:Java常用类库】_NumberFormat笔记.pdf 031110_【第11章:Java常用类库】_大数操作(BigIntger、BigDecimal)笔记.pdf 031111_【第11章:Java常用类库】_对象克隆技术笔记.pdf 031112_【第11章:Java常用类库】_Arrays笔记.pdf 031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf 031202_【第12章:JAVA IO】_RandomAccessFile笔记.pdf 031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 031204_【第12章:JAVA IO】_字节-字符转换流笔记.pdf 031205_【第12章:JAVA IO】_内存操作流笔记.pdf 031206_【第12章:JAVA IO】_管道流笔记.pdf 031207_【第12章:JAVA IO】_打印流笔记.pdf 031208_【第12章:JAVA IO】_System类对IO的支持笔记.pdf 031209_【第12章:JAVA IO】_BufferedReader笔记.pdf 031210_〖第12章:JAVA IO〗_IO操作实例笔记.pdf 031211_【第12章:JAVA IO】_Scanner笔记.pdf 031212_【第12章:JAVA IO】_数据操作流笔记.pdf 031213_【第12章:JAVA IO】_合并流笔记.pdf 031214_【第12章:JAVA IO】_压缩流笔记.pdf 031215_【第12章:JAVA IO】_回退流笔记.pdf 031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序笔记.pdf 031301_【第13章:Java类集】_认识类集、Collection接口笔记.pdf 031302_【第13章:Java类集】_List接口笔记.pdf 031303_【第13章:Java类集】_LinkedList类笔记.pdf 031304_【第13章:Java类集】_Set接口笔记.pdf 031305_【第13章:Java类集】_排序及重复元素说明笔记.pdf 031306_【第13章:Java类集】_SortedSet接口笔记.pdf 031307_【第13章:Java类集】_Iterator接口笔记.pdf 031308_【第13章:Java类集】_ListIterator接口笔记.pdf 031309_【第13章:Java类集】_foreach及Enumeration接口笔记.pdf 031310_【第13章:Java类集】_Map接口笔记.pdf 031311_【第13章:Java类集】_Map接口使用的注意事项笔记.pdf 031312_【第13章:Java类集】_IdentityHashMap类笔记.pdf 031313_【第13章:Java类集】_SortedMap类笔记.pdf 031314_【第13章:Java类集】_集合工具类:Collections笔记.pdf 031315_【第13章:Java类集】_Stack类笔记.pdf 031316_【第13章:Java类集】_属性类:Properties笔记.pdf 031317_〖第13章:Java类集〗_范例讲解:一对多关系笔记.pdf 031318_〖第13章:Java类集〗_范例讲解:多对多关系笔记.pdf 031401_【第14章:枚举】_枚举的作用笔记.pdf 031402_【第14章:枚举】_Enum笔记.pdf 031403_【第14章:枚举】_类集对Enum的支持笔记.pdf 031404_【第14章:枚举】_枚举的其他应用笔记.pdf 031501_【第15章:Java反射机制】_认识Class类笔记.pdf 031502_【第15章:Java反射机制】_Class类的使用笔记.pdf 031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义Annotation笔记.pdf 031603_【第16章:Annotation】_反射与Annotation笔记.pdf 031604_【第16章:Annotation】_深入Annotation笔记.pdf 031701_【第17章:Java数据库编程】_JDBC概述笔记.pdf 031702_【第17章:Java数据库编程】_MySQL数据库笔记.pdf 031703_【第17章:Java数据库编程】_SQL语法基础笔记.pdf 031704_【第17章:Java数据库编程】_JDBC操作步骤及数据库连接操作笔记.pdf 031705_【第17章:Java数据库编程】_执行数据库更新操作笔记.pdf 031706_【第17章:Java数据库编程】_ResultSet接口笔记.pdf 031707_【第17章:Java数据库编程】_PreparedStatement接口笔记.pdf 031708_【第17章:Java数据库编程】_处理大数据对象(1)—处理CLOB数据笔记.pdf 031709_【第17章:Java数据库编程】_处理大数据对象(2)—处理BLOB数据笔记.pdf 031710_【第17章:Java数据库编程】_CallableStatement接口笔记.pdf 031711_【第17章:Java数据库编程】_JDBC 2.0操作笔记.pdf 031712_【第17章:Java数据库编程】_事务处理笔记.pdf 031713_【第17章:Java数据库编程】_使用元数据分析数据库笔记.pdf 031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面】_基本容器:JFrame笔记.pdf 031803_【第18章:图形界面】_标签组件:JLabel笔记.pdf 031804_【第18章:图形界面】_按钮组件:JButton笔记.pdf 031805_【第18章:图形界面】_布局管理器笔记.pdf 031806_【第18章:图形界面】_其他容器笔记.pdf 031807_【第18章:图形界面】_不弹起的按钮组件:JToggleButton笔记.pdf 031808_【第18章:图形界面】_文本组件:JTextComponent笔记.pdf 031809_【第18章:图形界面】_事件处理笔记.pdf 031810_【第18章:图形界面】_单选钮:JRadioButton笔记.pdf 031811_【第18章:图形界面】_复选框:JCheckBox笔记.pdf 031812_【第18章:图形界面】_列表框:JList笔记.pdf 031812_【第18章:图形界面】_下拉列表框:JComboBox笔记.pdf 031813_【第18章:图形界面】_菜单组件笔记.pdf 031814_【第18章:图形界面】_文件选择框笔记.pdf 031815_【第18章:图形界面】_表格笔记.pdf 031901_【第19章:Java网络编程】_IP(Internet Protocol)与InetAddress笔记.pdf 031902_【第19章:Java网络编程】_URL与URLConnection笔记.pdf 031903_【第19章:Java网络编程】_URLEncoder与URLDecoder笔记.pdf 031904_【第19章:Java网络编程】_TCP程序设计笔记.pdf 031905_【第19章:Java网络编程】_UDP程序设计笔记.pdf 032001_【第20章:Java新IO】_缓冲区与Buffer笔记.pdf 032002_【第20章:Java新IO】_通道(Channel)笔记.pdf 032003_【第20章:Java新IO】_文件锁笔记.pdf 032004_【第20章:Java新IO】_字符集笔记.pdf 032005_【第20章:Java新IO】_Selector笔记.pdf 042101_【课程讲解】_附录:Eclipse开发工具笔记.pdf 050101_〖开发实例〗_Java开发实例讲解(人员管理)笔记.pdf
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 讲解方式: 以基础入门为主,使用PPT进行讲解,每个技术都配有相应的Demo进行知识落地理解 课程亮点: 适合对SSM没有使用过的同学,讲解通俗易懂,覆盖了当前SSM使用的基本操作 课程内容: 1、Spring简介及快速入门 2、Spring配置文件及其相应API 3、Spring注解开发 4、Spring web环境及其Junit的集成 5、Spring JDBCTemplate的基本使用 6、Spring AOP的介绍及其配置使用 7、Spring的声明式事务控制 8、SpringMVC的介绍及其快速入门 9、SpringMVC的数据请求和响应 10、SpringMVC的异常处理及其拦截器 11、MyBatis简介及其入门 12、MyBatis的配置文件详解 13、MyBatis的多表操作 适用人群: 在校大学生/职场小白 Spring部分: 1、Spring简介 2、Spring快速入门 3、Spring配置文件详解 4、Spring依赖注入详解 5、Spring相应API 6、Spring数据源集成配置 7、Spring注解开发 8、Spring集成Junit测试 9、Spring集成web环境 10、Spring JDBCTemplate基本使用 11、SpringAOP简介和快速入门 12、Spring XML方式配置AOP 13、Spring注解方式配置AOP 14、Spring编程式事务控制介绍 15、Spring基于XML方式的声明式事务控制 16、Spring基于注解方式声明式事务控制 SpringMVC部分: 1、SpringMVC简介 2、SpringMVC组件解析 3、SpringMVC数据响应 4、SpringMVC数据请求 5、SpringMVC文件上传 6、SpringMVC+Spring完成练习 7、SpringMVC拦截器 8、SpringMVC异常处理机制 MyBatis部分: 1、MyBatis入门操作 2、MyBatis的Dao层实现方式 3、MyBatis的映射文件深入 4、MyBatis的核心文件深入 5、MyBatis的多表操作 6、MyBatis的注解开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值