一、概述

1、定义:

程序运行过程中的发生了不正常的情况

2、异常处理机制和作用----JVM虚拟机打印的

java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序员参考。

作用:增强程序的健壮性

3、异常的存在形式----类----java.lang中

每一个异常类都可以创建一个对象出来。

4、异常的继承结构

(1)Throwable的两个子类:

<1>Error---错误,都是不可处理的,直接退出JVM

<2>Exception---异常,可以处理

所有的异常都是发生在运行阶段,因为只有运行阶段才可以new对象

两个子类:

  • Exception的直接子类:编译时异常,要求程序员在编写程序时必须预先对这些异常进行处理
  • RuntimeException:运行时异常,编写程序阶段程序员可以预先处理,也可以不管(空指针异常那些)

(2)老杜总结图

  • 整体结构  
  • 编译时异常----预先处理的异常

  • 运行时异常----控制台报错

5、编译时异常和运行时异常区别

编译时异常一般发生的概率比较高----运行之前预处理(受检异常,受控异常)

运行时异常一般发生的概率比较低-----没必要在运行之前预处理(未受检异常,非受控异常)

二、编译时异常

1、编写程序时程序画红线的的错

---必须处理,处理后才能正常执行,不然就程序中止了

2、两种处理方式

(1)throws上抛--交给上一级调用者处理(异常上抛)

(2)try...catch -----异常捕捉,自己处理(真正的处理)

3、处理方式选择标准

看这个错误是否需要上报,需要选择throws,其他都用catch

【注】

  • 若异常每一级都选择异常上抛,都没有解决,最终抛给了JVM,只能中止java程序的执行
  • 异常处理机制的作用---增强程序的健壮性,希望异常发生了也不影响程序的执行,因为异常捕捉了之后不会影响后续程序的运行

故一般main方法建议使用try...catch处理

  • throws后面和catch()内的抛出的异常类,可以写具体对应的异常类,也可以写其父类

4、编译时异常处理的目的

     让程序编译通过,通过后,再根据运行时提示信息去调程序,而不是异常不处理,JVM运行时直接中止,控制台报错

即:主要目的是让程序顺利运行,控制台打印出异常而不是不报错中止,

虽然有异常,但是通过异常处理方式给出来,只是待进一步进行问题的解决

(一)try catch语句

1、基本形式

try{程序正常要执行的语句
}catch (具体异常类 e){处理语句
}finally{有无异常都必执行的语句,一般放资源释放语句
}
  • 一般根据异常提示,编写软件自动生成
  • 这种方式下,try语句块中,某一行有异常,该行后面内容不会执行,

catch捕捉到异常后才会执行catch内及后续的代码

2、基本规则

(1)main方法中一定用try catch语句

(2)catch可以写多个,也可以不写

每个catch可以对应一个具体类,精确的一个一个处理,有利于程序的调试

catch写多个时,异常类从上到下必须遵循从小到大(异常具体类在上---异常父类在下)

(3)finally相关

  • finally中的语句最后一定会执行的,即使try语句块中代码出现了异常
  • finally必须和try catch一起出现,不能单独编写
  • finally语句必须与try 语句连用,没有catch也可以
  • finally相当于try语句跳过异常的 延续代码部分
  • fianlly中使用return或throws语句会让try 和catch中return或throws语句失效

(4)return语句

  • return语句执行----代表方法的结束

return语句一定最后执行的,无论是return;还是return i

  • finally中有return try中return失效,因为finally语句块一定会执行的

3、异常的追踪和调错--catch中

(1)两个重要的方法

e.getMessage()---获取异常的简单描述信息

只是获得简单描述,对调错没有指导性作用

e.printStackTrace()----打印异常追踪的堆栈中信息(开发中用比较多)

e是异常对象

(2)e.printStackTrace()--打印堆栈中错误信息

异常处理时,catch语句中必须加e.printStackTrace(

这样控制台才能在正常运行程序的情况下,还能打印出异常信息,否则,异常抛出或捕捉后,没有异常提示信息,会以为没有异常

(3)查看异常追踪信息,快速调试程序:

  • 从上往下看,一行一行看(下面的异常是由上面的异常导致的,所以从上往下看)
  • SUN写的代码不用看,主要问题出现在自己编写的代码上(由包名可以看出是SUN的还是自己的代码)

(二)throws上抛

在方法声明的位置上,加上throws关键字,抛给上一级调用者(异常上抛)

         上一级调用者同样也有这两种处理方式---throws和catch

【注】这种方式有异常情况下,该方法下的后续代码不会执行,通过 [方法名  throws 异常类名] 直接跳到上级调用方法

(三)throw 手动抛异常----自定义异常

1、自定义异常类

(1)编写一个类继承Exception或RuntimeException

(2)提供两个构造方法,一个无参数的,一个带有String参数的

有参的构造方法用来传递提示信息----e.getMessage

//1、自定义异常类
public class MyException extends Exception{//无参构造public MyException ();   //有参构造public MyException (String s);
}//2、使用异常类
public class Test{puiblic static void main(String[] args){//创建自定义异常对象MyException e=new MyException ("密码错误!");//打印堆栈信息e.printStackTrace();//获取并输出异常的描述信息String msg=e.getMessage();System.out.println(msg);}
}

  这样控制台不仅会输出自定义异常的堆栈信息,还会输出 描述信息  

2、自定义异常的作用

通过使用自定义异常类,来中止不满足条件的情况,不是用return终止的方式

一般方式:不满足条件,return; 终止方法

调用异常方式: throw new MyException ("密码错误!"),不满足条件,抛异常并终止

(三)常见编译时异常

  io异常

FileNotFoundException

ClassNotFoundException

SQLException
   NoSuchFieldException
   NoSuchMethodException
   ParseException

三、运行时异常

1、数组下标越界异常---ArrayIndexOutBoundsException

2、空指针异常---NullPointerException

避免空指针异常的两个经验:

(1)判断一个对象是否为null最好放在条件的最前面

2)判断一个对象是否等于null,最好用【null==对象名】 或 【”某值“.equals(对象)】

因为 对象==null,容易误写成 对象=null,就成赋值----空指针异常

对象.equals(”某值“)----如果对象的值一旦是空----空指针异常

3、类转换异常---Java.lang.ClassCastExoeption

(1)出现条件:

强制类型转换出错----两个对象没有继承关系

(2)避免方法----instanceof运算符

4、数字格式化异常---NumberFormatException

异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption相关推荐

  1. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  2. java 运行 对象_java实例对象的编译时类型和运行时类型

    为什么要区分编译时类型和运行时类型? 看这样一句代码:Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 访问属性时得到的是Person ...

  3. 编译时类型和运行时类型到底是什么?

    最近在看多态,里面有一句话困扰了我很久,就是 编译时类型和运行时类型 ps:多态定义:把子类对象直接赋给父类的引用时,当运行时调用该引用类型的方法时,其方法行为总是表现出子类的行为特征,而不是父类的行 ...

  4. java面向对象三大特性之多态---编译时多态和运行时多态详解

    一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...

  5. java编译时多态和运行时多态_运行时多态、编译时多态和重载、重写的关系(不区分Java和C#,保证能看懂!)...

    以前在大学学习OOP的时候,知道了重载和重写的区别,但如果要把他们和多态联系起来,我想很多新手朋友和我当初一样是死记的,可是时间长了,自然而然就忘记了,最近在写测试的时候,终于"开窍&quo ...

  6. 编译时多态和运行时多态

    在JAVA中有两种多态是指:运行时多态和编译时多态. 关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指"一种定义,多种实现& ...

  7. 编译时类型 和运行时类型的 区别(1)

    class T{ void f(int x){ System.out.println("int in T:" +x); } void f(double x){ System.out ...

  8. C# WPF 项目中无法使用Console输出时出现句柄无效的IO异常解决方法

    如以下代码,重点看:ConsoleManager.Show()的位置注释即可: using System; using System.Collections.Generic; using System ...

  9. Angular Component 开发时属性和运行时属性的对照

    看个具体的例子: @Component({selector: 'cx-carousel',template: `<ng-container *ngFor="let item$ of i ...

最新文章

  1. (传送门)linux命令总结dd命令详解
  2. JavaWeb:JSP
  3. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
  4. 软件工程之快速原型模型
  5. 一键截图_教你一键为iPhone截图加上手机外壳,新技能快学起来!
  6. 常见的 Error 和 Exception
  7. 农业部部署农业大数据发展工作 评:对农业现代化很重要
  8. Python url编码、url解码
  9. Spring 实践 -拾遗
  10. [论文阅读][经典ICP] A Method For Registration Of 3D Shapes
  11. 吴恩达|机器学习作业2.0Logistic 回归
  12. sr锁存器 数电_数字电路第5章(1SR锁存器)_2.ppt
  13. bind 绑定标签的用法
  14. http://blog.csdn.net/evankaka/article/details/45155047
  15. MEGA-X 3D打印机教程:01_我的第一台3D打印机参数
  16. 七号信令系统在GSM中的应用
  17. java 建立临时文件夹
  18. ENVI:标准库中光谱(.sli)重采样
  19. 对二维数组的数组名取地址,a,a+1的理解
  20. 3G无线网卡速度的小测试

热门文章

  1. 调用百度汇率api 获取各国的汇率值
  2. 2021-07-27 百度飞桨AI达人创造营手账
  3. 什么叫手机或设备的ID
  4. powerpoint预览_如何添加,删除和重新排列PowerPoint幻灯片
  5. 合成分红游戏源码_旅行世界遛狗养狗恐龙源码,分红龙源码、红包龙、合成龙...
  6. 鸿蒙系统功能,华为HarmonyOS2.0系统功能都有哪些呢-华为鸿蒙系统HarmonyOS2.0功能介绍[图文]_咖绿茵手游站...
  7. vue解决打开新窗口被拦截的的实战方法
  8. 人人的互联网时代——读娱乐致死和未来是湿的
  9. 微生物群也有记忆 | 微生物群能被“训练”
  10. U盘无法在磁盘管理器中删除,显示不支持该操作的时候可以用以下的办法,亲测可以解决