异常(Exception)

基本概念

Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两大类:

  1. Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽、栈溢出等严重情况。Error是严重错误,程序会崩溃。
  2. Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编译时,编译器检查出的异常]。

异常体系图

  1. 异常分为两大类,运行时异常和编译时异常。
  2. 运行时异常,编译器检查不出来。一般是指编译是的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
  3. 对于运行时异常,可以不处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
  4. 编译时异常,是编译器要求必须处置的异常。

常见的运行时异常

  • NullPointerException 空指针异常
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。

  • ArithmeticException 数学运算异常

当出现异常的运算条件时,抛出此异常。

  • ArrayIndexOutOfException 数组下标越界异常

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,该索引为非法索引。

  • ClassCastException 类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。

  • NumberFormatException 数字格式不正确异常

当应用程序试图将字符串转换为一种数值类型,但该字符串不能转换为适当格式时,抛出异常。

编译时异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

  1. SQLExecption 操作数据库时,查询表可能发生异常。
  2. IOException 操作文件时,发生的异常。
  3. FileNotFoundException 操作不存在的文件,发生的异常。
  4. ClassNotFoundException 加载类,而类不存在时,发生异常。
  5. EOFExecption 操作文件,到文件末尾,发生异常。
  6. IIIegalArguementException 参数异常

异常处理

异常处理就是当发生异常时,对异常的处理方式。

异常处理的方式:

  1. try-catch-finally 程序员在代码中捕获发生的异常,自行处理。
  2. throws 将发生的异常抛出,交给调用者(方法)处理,最顶级的处理者就是JVM。

try-catch异常处理

java提供try和catch块来处理异常,try块用来包含可能出错的代码。catch块用与处理try块中发生的异常。可根据需求在程序中有多个try...catch块。

try{

//可疑代码

//将异常生成对应的异常对象,传递给catch块

} catch(异常){

//对异常的处理

}

//如果没有finally,语法可以通过

try-catch 方式处理异常-注意事项

  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入catch块。
  2. 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally{}
  4. 可以有多个catch语句,捕获不同异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch。
  5. 可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不是否发生异常,都必须执行某个业务逻辑。
  6. catch捕获异常后,只是会跳出try块,不再执行try代码块发生异常之后的代码段。但是在捕获完成后,可以继续执行catch块之后的代码。
package com.study.srv.demo9;import com.study.srv.demo4.Person;/*** @author Wen先森* @version 1.0* @date 2022/2/28 18:18*/
public class Demo01 {public static void main(String[] args) {try {int a=3;int b=0;System.out.println(a/b);} catch (ArithmeticException e) {System.out.println(e.getMessage());} finally {System.out.println("最终执行");}System.out.println("如打印此句,说明程序捕获异常没有崩溃");}
}

package com.study.srv.demo9;import com.study.srv.demo4.Person;/*** @author Wen先森* @version 1.0* @date 2022/2/28 18:18*/
public class Demo01 {public static void main(String[] args) {//没有catch块,只有 try-finallytry {int a=3;int b=0;System.out.println(a/b);} finally {System.out.println("没有catch块,程序不会捕获异常,应该会崩溃");}System.out.println("如打印此句,说明程序捕获异常没有崩溃");}
}

try-catch-finally 执行顺序小结

  1. 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行fianlly里面的语句。
  2. 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还是需要执行fianlly块里的语句。
package com.study.srv.demo9;import com.study.srv.demo4.Person;/*** @author Wen先森* @version 1.0* @date 2022/2/28 18:18*/
public class Demo01 {public static void main(String[] args) {System.out.println(fly());}public static int fly(){try {String[] name=new String[3];if (name[1].equals("tom")){//虽然有数组,但是此时的数组为null,所以在进行判断时会出现NullPointerException异常。System.out.println(name[1]);}else {name[3]="jack";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e){//虽然出现NullPointerException异常返回3return 3;}finally {//但是finally块里是一定会执行的,所以最终其实是返回4.return 4;}}
}

throws异常处理

  1. 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
  2. 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

throws方式处理异常-注意事项

  1. 对于编译异常,程序必须处理,比如try-catch或者throws
  2. 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
  3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型。
  4. 在throws过程中,如果有方法try-catch,就相当于处理异常,就不需要throws。

自定义异常

当程序中出现了某些“错误”时,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

自定义异常步骤:

  1. 定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
  2. 如果继承Exception,属于编译异常。
  3. 如果继承RuntimeException,属于运行时异常(一般都是继承的RuntimeException)。
package com.study.srv.demo9;/*** @author Wen先森* @version 1.0* @date 2022/3/4 10:36*/
public class Demo04 {//因为是继承的运行时异常,所以默认就是throws方式处理public static void main(String[] args) {int age=10;if (!(age>=18&&age<=60)){throw new AgeException("年龄需要在18至60之间");}System.out.println("年龄范围正常");}
}
//一般情况下,把自定义异常继承RuntimeException
//即把自定义异常做成运行时异常,好处是可以使用默认的显示机制
class AgeException extends RuntimeException{public AgeException(String message){super(message);}
}

throw和throws的区别

意义 位置 后面跟的东西
throws 异常处理的一种方式 方法声明中 异常类型
throw 手动生成异常对象的关键字 方法体中 异常对象
package com.study.srv.demo9;/*** @author Wen先森* @version 1.0* @date 2022/3/4 11:25*/
public class Demo05 {public static void main(String[] args) {try {ReturnException.methodA();//1.调用方法A} catch (Exception e) {System.out.println(e.getMessage());//5.此时打印出返回的异常信息。打印 "制造异常"}ReturnException.methodB();//6.因为catch块捕获了异常,所以程序继续执行 ,调用方法B}
}
class ReturnException{static void methodA(){try {System.out.println("进入到方法A");//2.进入方法A后打印 "进入到方法A"throw new RuntimeException("制造异常");//3.此时出现异常,返回异常信息,但是由于有finally块,所以要先去执行finally块代码,之后才能返回异常信息。} finally {System.out.println("用A方法的finally");//4.执行finally块,打印 "用A方法的finally"}}static void methodB(){try {System.out.println("进入到方法B");//7.进入方法B 打印 "进入到方法B"return;} finally {System.out.println("用B方法的finally");//8.执行finally块,打印 "用B方法的finally"}}
}

Java基础——异常相关推荐

  1. Java基础-异常(Exception)处理

    Java基础-异常(Exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常的概述 什么是异常?Java代码在运行时期发生的问题就是异常.在Java中,把异 ...

  2. Java基础-异常-throws Exception-抛声明

    Java基础-异常-throws Exception-抛声明 参考文章: (1)Java基础-异常-throws Exception-抛声明 (2)https://www.cnblogs.com/pl ...

  3. JAVA基础——异常详解

    阅读目录 一.异常简介 二.try-catch-finally语句 三.throw和throws关键字 四.java中的异常链 五.结束语 JAVA异常与异常处理详解 回到顶部 一.异常简介 什么是异 ...

  4. Java基础—异常分类及处理

    目录 一.概念 三.异常的处理方式 四.throw 和 throws 的区别: 一.概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对 ...

  5. Java基础 — 异常

    异常对象都是派生于Throwable 类的一个实例. 异常层次结构简化示意图: 所有的异常都是由Throwable 继承而来,但在下一层立即分解为两个分支:Error 和 Exception Erro ...

  6. Java基础 —— 异常

    目录 异常的概念及分类 异常的处理try-catch-finally 异常抛出throw(s) 自定义异常 异常的概念及分类 什么是异常 异常是指在程序的运行过程中发生的一些不正常事件.比如:除0溢出 ...

  7. Java基础---异常---turow和throws

    异常 1.Throwable:可抛出的,是异常的顶层父类,其他的异常或者错误都是Throwable的子类类型,只有是Throwable的体系类型,才可以使用异常的处理机制 2.Error:错误,是Th ...

  8. 黑马程序员--java基础--异常(二)

    -------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iO ...

  9. Java基础-异常机制

    异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序 所需文件找不到 网络连接不通或中断 算术运算错 (被零除-) 数组下标越界 装载一个不存在的 ...

最新文章

  1. java getname file_Java File getName()方法
  2. php批量修改标题,帝国CMS批量修改信息标题的方法
  3. 费马大定理,集惊险与武侠于一体
  4. 记得重用layout
  5. 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
  6. 手机搜狗浏览器怎么样
  7. Car2go 的前端框架选择
  8. android 屏幕点击录制视频教程,安卓手机怎么屏幕录像,手机屏幕录像详细教程...
  9. 计算机软考论文分数,信息系统项目管理师论文37分等得分低原因、不及格原因...
  10. Uphone开发心得
  11. Win系统设置虚拟内存
  12. 计算机专业和机械自动化哪个好,自动化和机械设计制造及其自动化有哪些区别?选哪个好呢?...
  13. Unknown column 'xxx' in 'field list'
  14. PaddleNLP新增AutoPrompt自动化提示功能,登顶FewCLUE小样本学习榜单
  15. 最新版去水印小程序搭建教程
  16. 拥有谷歌100万股原始股,奥尼尔每年能够得到多少分红?
  17. [JS JQUERY] 60个JSP免豆资料(教程+源码)下载地址汇总
  18. 与任何手机无线同步/共享您的音乐收藏
  19. G笔试题-2012年9月25日
  20. 使用AlarmManager实现Android应用每天定时执行任务

热门文章

  1. 教你ZIP文件如何解压读取、压缩下载【解答】
  2. docker入门之HelloWorld
  3. python找电影资源_Python爬虫爬取BT之家找电影资源
  4. FDTD solutions
  5. 【Unity】捕鱼达人开发流程
  6. 常用的工具网站(网址 + 效果图)
  7. Python 京东抢购茅台脚本(亲测可用)
  8. pymongo模块详解(含官方文档翻译)
  9. c++中一个冒号“:”的使用
  10. web前端设计与开发(一)学习前的了解