异常

定义:

  • (狭义)异常就是在系统运行过程中出现的问题。即程序在执行过程中出现的不正常的情况,这些情况很多不靠代码解决。
  • (广义)开发过程中的语法或者逻辑错误导致的异常。
    JAVA中讨论的异常皆为(狭义)。

分类:

  • Error–虚拟机无法解决的严重问题。

这类问题不能通过代码解决,是硬件问题。
例子.jvm内存不足时异常.

public static void main(String[] args) {List list = new ArrayList<>() ;while(true){list.add(new Random());//随机加数}
  • Exception–其他因为编程错误或者偶然因素导致的一般性问题.(可以用针对性的代码处理.)

    • 例子.空指针访问
     public static void main(String[] args) {String s = null;s.length();}
    //异常结果(异常类型--空指针异常)Exception in thread "main" java.lang.NullPointerExceptionat day01.ErrorDemo.main(ErrorDemo.java:65)
    
    • 例子.数组下标越界
        public static void main(String[] args) {int[] a = new int[3];a[3]=1;}
    //异常结果(异常类型--数组下标越界)
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at day01.ErrorDemo.main(ErrorDemo.java:19)
    • 例子.算数异常
     public static void main(String[] args) {int a = 10;int b = 0;System.out.println(a/b);}
    //异常结果(异常类型--算数异常)          (异常原因)Exception in thread "main" java.lang.ArithmeticException: / by zeroat day01.ErrorDemo.main(ErrorDemo.java:19)(异常位置)//异常的位置和原因可能不在同一个地方
    • 例子.类型转换异常
    public static void main(String[] args) {String s = "gogogo";Object obj = s;if (obj instanceof Integer){Integer i = (Integer) obj;}
    //异常结果(异常类型--类型转换异常--将实例转化为不属于对象的子类.)Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integerat day01.ErrorDemo.main(ErrorDemo.java:39)
    • 数字格式化异常
    public static void main(String[] args) {int i = Integer.parseInt("fight");//parse()将字符串参数解析为带符号的十进制整数。}
    //异常结果
    Exception in thread "main" java.lang.NumberFormatException: For input string: "fight"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:580)at java.lang.Integer.parseInt(Integer.java:615)at day01.ErrorDemo.main(ErrorDemo.java:53)

解决方法

  • 虚拟机处理

    如果程序员对异常不做处理那么虚拟机就会直接结束程序运行,给出异常信息。

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at day01.ErrorDemo.main(ErrorDemo.java:19)
  • 编写程序时,考虑到异常的检测捕获、声明、抛出。

体系

  • Throwable是所有异常的祖先类,它有两个子类:Exception类、Error类。

    • Error表示错误,往往是硬件问题,程序中并不做处理。
    • Exception 表示“异常”,是所有“异常类”的父类(程序开发人员所关注的异常)。
  • 捕获异常最理想的是在编译期间,但有的异常只有在运行时才会发生。比如:除数为0,数组下标越界等。因此,异常又分为:运行时异常编译时异常

    • 运行时异常

      • 程序运行时,才会抛出的异常,也叫非受检异常。

      • 举例:

        //数组下标越界
        /*                                           (异常类型--数组下标越界)Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at day01.ErrorDemo.main(ErrorDemo.java:19)public static void main(String[] args) {int[] a = new int[3];a[3]=1;}//算数异常/*                                          (异常类型--算数异常)               (异常原因)Exception in thread "main" java.lang.ArithmeticException: / by zeroat day01.ErrorDemo.main(ErrorDemo.java:19)(异常位置)//异常的位置和原因可能不在同一个地方public static void main(String[] args) {int a = 10;int b = 0;System.out.println(a/b);}*///类型转换异常/*                                        (异常类型--类型转换异常--将实例转化为不属于对象的子类.)Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integerat day01.ErrorDemo.main(ErrorDemo.java:39)public static void main(String[] args) {String s = "gogogo";Object obj = s;if (obj instanceof Integer){Integer i = (Integer) obj;}}*///数字格式化异常/*                                      (异常类型--数字格式化异常)Exception in thread "main" java.lang.NumberFormatException: For input string: "fight"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:580)at java.lang.Integer.parseInt(Integer.java:615)at day01.ErrorDemo.main(ErrorDemo.java:53)public static void main(String[] args) {int i = Integer.parseInt("fight");//parse()将字符串参数解析为带符号的十进制整数。}*///空指针异常/*                                          (异常类型--空指针异常)Exception in thread "main" java.lang.NullPointerExceptionat day01.ErrorDemo.main(ErrorDemo.java:65)public static void main(String[] args) {String s = null;s.length();}*/
    • 编译时异常

      • 除去运行时异常,其余都是编译时异常,也叫检测异常、受检异常。
      • 举例:IOException、SQLException
    • 体系图

异常处理

  • Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

  • 捕获异常的相关函数。(写法3中有例子。)

    • getMessage()—这是程序员用于获取异常信息的函数。
    • printStackTrace()—这是将异常信息打印到控制台的函数(更直接)。

基本语法

try{

可能会发生异常的代码

}catch(异常类型 引用名){

​ 异常处理代码

}finally{

必须执行代码

}

  • try
    try块中的任何一条代码异常,try块中剩余的代码便不会被执行,程序将跳转至catch块(异常处理块)中,随时会中断。
  • catch
    把捕获到类型匹配的异常进行处理,保证程序的运行。catch块里往往放着异常处理函数。
  • finally
    finally块中的代码,是程序无论何时必须被执行的,一个try块只能对应一个finally块
    • 写法1
    public static void main(String[] args) {int a = 10;int b = 0;try{System.out.println(a/b);//可能出现异常的语句。}catch (ArithmeticException p){//在此处填上异常的类型对象System.out.println("除数不能为0.");//异常后语句}}
    • 写法2
    // try{}里面嵌套try{}catch(){}try{int a = 10;int b = 2;System.out.println(a/b);try{int[] a1 = new int[3];a1[3]=1;}catch(ArrayIndexOutOfBoundsException A1){System.out.println("异常:数组下标越界.");}}catch(ArithmeticException A2){System.out.println("异常:算数异常.");}
    • 写法3
     //一个try{}对应多个catch(){}.try{//算数异常int a = 10;int b = 2;System.out.println(a/b);//数组下标越界异常int[] a1 = new int[3];a1[3]=1;}catch(ArithmeticException A2){System.out.println("异常:算数异常.");}*//*catch(ArrayIndexOutOfBoundsException A1){System.out.println("异常:数组下标越界.");}*//*catch(Exception e){System.out.println("系统忙请稍后再试.");//给用户的基本提示.System.out.println(e.getMessage());//打印简略异常信息 , 后期可用第三方日志组件向文件输出信息.e.printStackTrace();//打印异常详细信息到控制台.}*/
    • 写法4
     public static int finaldemo(){try{int a = 10;int b = 0;System.out.println(a/b);return 3;}catch(ArithmeticException A2){System.out.println("异常:算数异常.");return 0;}finally{           //finally里面的语句块必须被执行.System.out.println("aaaaaa");return 1;//如果fianlly里面有return,程序到此结束}//System.out.println("bbbbbb");如果前面有return该语句会被跳过.}

throws关键字

  • throws关键字可以修饰方法。子类重写父类中的方法时,子类方法不能抛出比父类类型更大的异常。
  • 用该关键字声明该方法不处理异常,而交给方法调用处处理,调用处若不处理,也可用throws声明。
  • throws声明的是运行时异常,调用时可不处理异常。
  • throws后面可以跟多个异常
public static void main(String[] args) {try {test();//方法调用处}catch (ArithmeticException a){System.out.println("异常类型:算数异常.");}}public static void test()throws ArithmeticException{int a = 10;int b = 0;System.out.println(a/b);}

throw关键字

  • throw关键字修饰的是对象,该关键字用于显式抛出异常,抛出的是异常类的实例化对象。
  • 在创建对象的构造方法中可传入异常的原因。
public class Demo6 {public static void main(String[] args) {try{int a = test(-3);System.out.println(a);}catch(RuntimeException r){System.out.println(r.getMessage());}}public static int test(int a){if (a < 0){throw new RuntimeException("传入的值有误");//在程序运行时,主动抛出异常对象,在构造方法中传入异常的原因}else{return a;}}
}

自定义异常

  • 使用前提:当已知的异常不能满足用户需求时,可以自定义异常。
  • 自定义异常时,如果是编译时异常,就继承Exception,运行时异常,就继承RunTimeException
public class SanJiaoXing {public static void main(String[] args) {SanJiaoXing s = new SanJiaoXing();try {System.out.println(s.pan_duan(1.3,2.6,9.9));   //调用处} catch (SanJiaoExp sanJiaoExp) {sanJiaoExp.printStackTrace();}}public String pan_duan(double a,double b,double c) throws SanJiaoExp {if(a+b>c&&a+c>b&&b+c>a){return "这些边可以构成三角形";}else{throw new SanJiaoExp("这些边不能构成三角形.");}}
}//自定义异常(三角形)
public class SanJiaoExp extends Exception {public SanJiaoExp(String message) {super(message);//调用Exception的构造方法}}

javaSE探赜索隐五<异常>相关推荐

  1. JavaSE——异常处理(异常简介、try-catch-finally、throws、throw)

    第4节 异常处理 异常处理学习的目标: 明确说明是异常(重点) 能辨识出常见的异常及其含义(熟悉) 理解异常产生的原理(了解) 能处理异常(重点) 能够自定义异常(熟悉) 一.什么是异常? 异常是在程 ...

  2. python 异常处理模块_扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  3. javaSe探赜索隐IO--File

    IO File类 概要 File类是java.IO包下面的一个重要的类, 继承了Object类,实现了Serializable.Comparable接口. File对象表示一个硬盘上的文件或文件夹. ...

  4. javaSE探赜索隐四<数组>

    数组 一.概念 数组是相同数据类型元素的集合.(如果数组中存的是引用类型,则存的是对象的引用.) 数组是一种线性的数据结构. 二.声明方式 数据类型 [] 数组名(后面可以跟多个数组名定义多个数组.) ...

  5. JavaSE探赜索隐之乾坤袋(集合)

    目录 集合的概念 集合API Collection接口 List接口.实现类 Set接口实现类 Map接口 集合的概念 说道集合就得先谈谈数组.数组是同一类元素的有序集合,但数组有其局限性,那就是定义 ...

  6. javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>

    文章目录 java语言的应用 Java语言发展史 Java语言的特点 Java语言体系结构 Java语言的运行机制 Java运行环境 java语言的应用 web程序 安卓app 软件工具 大数据 传感 ...

  7. 《码出高效》五 异常与日志

    前言 本章主要是讲异常处理,关于异常主要有三个问题: 哪里发生异常 谁来处理异常 如何处理异常 围绕这三个问题就有了一套异常处理机制 异常分类 通常异常时针对不稳定代码的,并且需要区分类型 throw ...

  8. 【javaSE】java异常详解

    内容介绍 1 认识异常 1.1 初识异常 1.2 防御式编程 1.3 异常的好处 2 异常的用法 2.1 捕获异常 2.2 异常处理流程 2.3 抛出异常 2.4 异常说明 2.5 关于finally ...

  9. 【javaSE】中异常如何处理

    目录 文章目录 一.异常的初识 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 二.异常的处理和抛出 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.4异常的处理流程 三.自定义异 ...

最新文章

  1. 前端开发知识总结思维导图
  2. 为什么可积不一定可导_耳机为什么分L和R?你一定不知道真相
  3. 计算机英语protocols,计算机网络协议词汇Protocols
  4. Codeforces Round #193 (Div. 2)
  5. 算法导论之平摊分析(动态表)
  6. oracle11g基目录和主目录,Red Hat Enterprise Linux4.0 安装oracle11g
  7. Android WebView注入js文件,判断当前HTML有没有某个js然后再注入
  8. vue 动态绑定 video src,不能正常播放问题
  9. 办公自动化-实测doc文档-创建文档添加内容-0223
  10. unity 存档插件_【Unity消息】5月1日到5月15日 Unity资源商店大促
  11. c++的lambda表达式捕获this_贯穿 C++ 11 与 C++ 17 的 Lambda 到底是个什么?
  12. C++类的定义要注意最后的分号不要丢了
  13. [ZT]软件质量属性
  14. 软件开发标准(文档模板)
  15. python怎么爬虎牙_Python_虎牙妹子爬虫实现
  16. excel如何设置保留两位小数
  17. 第5章 域内横向移动分析及防御
  18. 如何在Ubuntu系统下使用扫描仪(by quqi99)
  19. C 语言究竟能干什么
  20. 郑州科技学院计算机,郑州科技学院2005级(成)计算机信息管理一班

热门文章

  1. Amazon亚马逊卖家设置World First(WF卡)收款教程!
  2. pdf文件预览 浏览器窗口名修改
  3. 认知服务调用如何使用图片的DataURL
  4. 计算机上电自检的过程,电脑每次开机都自检的几种解决方法介绍
  5. Lingo练习 选拔问题
  6. AutoStitch: a new dimension in automatic image stitching
  7. VR系列--资料汇总
  8. 江城如画里,山晚望晴空。 两水夹明镜,双桥落彩虹。 人烟寒橘柚,秋色老梧桐。谁念北楼上,临风怀谢公
  9. 一位励志的盲人程序员加我微信,求助找工作
  10. mysql 五舍六入_四舍六入五成双(适用于MYSQL)(最大支持小数点第9位)