异常概述:运行时发生的不正常情况

在java中用类的形式对不正常的情况进行了描述和封装对象。

描述不正常的类,称之为异常类。

异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述。

不同的问题用不同的类进行具体的描述,比如角标越界,空指针等。

异常体系两大类:

无论是error,还是Exception,问题发生就应该可以抛出,让调用者知道并处理,该体系的特点就在于Throwable及其所有子类都具备可抛性。

Throwable:

① 一般不可处理的。Error

特点:是由JVM抛出的严重性问题;这种问题一般不针对处理,直接修改程序。

② 可处理的。Exception

可抛性:被throws 和 throw 关键字所操作的类和对象都具备可抛性

该体系的特点:子类的后缀名都是用其父类名作为后缀名,阅读性很强。

异常分类:

检测性异常:即除RuntimeException及其子类以外的异常。这类异常在编译时就进行检测,不处理不能通过;

非检测性异常:即运运行时异常RuntimeException及其子类。这类异常不处理变异也可以通过,如果有抛出 直接抛到控制台让调用者进行修正;

自定义异常:

要么继承 Exception 要么继承 RuntimeException

如果抛出一个在Java中没有定义过的异常,这时就需要自定义创建一个异常类。

注:自定义一个异常类,必须要继承一个异常体系才可以被抛出,被throw throws所操作

异常抛出注意事项:

子类覆盖父类只能抛出父类的异常或者子类或者子集

① 子类在覆盖父类方法时,父类方法如果抛出了异常,那么子类的方法只能抛出父类异常或者该父类异常的子类;

② 如果父类抛出多个异常,那么子类只能抛出父类异常的子集

注意:如果父类的方法没有抛出,那么子类覆盖式也决不能抛出,只能try

异常处理:throw,throws和try...catch;finally;

用类封装描述异常(称为异常类),不同的问题不同的类,当程序中遇到可能会发生异常的时候抛出异常类或进行捕获异常处理。

异常抛出

throw 和 throws 的区别

① throw:使用在函数内,throw抛出的是异常对象;throw new 异常类 ( )

② throws:使用在函数上,throws抛出的是异常类,可抛出多个,用逗号隔开( , );throws 类名,...,...,

PS:当 throw new RuntimeException的时候,不用throws

throw:

抛出一个异常,一般是在函数代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常

public void getOffer(String s) {
if(s.equals("abc")) {
throw new NumberFormatException();
}
if(s.equals("")) {
throw new Exception("输入参 S 不能为空");
} else {
System.out.println(s);
}
}

throws:

可能抛出异常的声明  (用在声明方法时,表示该方法可能要抛出异常)

当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理

public class testThrows(){
public static void function() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能强制类型转换。");
}
}

异常捕捉

捕获异常:try...catch 关键字捕获异常 tay...catch放在异常可能会发生的地方

try
{
//需要被检测异常的代码(保护代码块)
}catch(异常类 引用名)//该类用于接收发生的异常对象
{
//处理异常的代码(异常类)
}catch(异常类 引用名)
{ //可多重捕获,可在try语句后面添加任意数量的catch块.
/* 如果保护代码中发生异常,异常抛给第一个catch块,异常相匹配的话,则在这里被捕获。如果不匹配,
就会传给第二个catch块,如此直到异常被捕获或通过所有catch块为止 */
//一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义
}
finally //通常用于关闭(释放)资源
{
//finally代码块里面的动作必定会执行,无论有没有发现捕获异常,都一定会执行的代码
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}

try catch finally 代码块组合特点

① try catch finally

② try catch(多个)当没必要资源需要释放时,可以不用定义finally

③ try finally  异常无法直接catch处理,但是资源需要关闭

捕获处理原则

在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;

用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;

如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理

异常处理原则:

① 函数内部如果抛出需要检测的异常,那么函数上必须要声明。否则必须要在函数内使用try...catch捕捉,否则编译失败;
  ( RuntimeException以外的异常需要throws声明 )
② 如果调用到了声明异常的函数,要么ctry catch要么throws,否则编译失败。 ③ 功能内容可以解决是用catch;解决不了用throws告诉调用者,由调用者解决。 ④ 一个功能如果抛出了多个异常,调用时必须有多个catch进行针对性处理。内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个;

Java异常类及处理的更多相关文章

  1. 面试准备(三) Java 异常类层次结构

    在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的 ...

  2. Java 异常类层次结构

    在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中. 下面的图展示了Java异常类的继承关系. 图1 粉红色的是受检查的异常(checked exceptions),其必须被 ...

  3. java——异常类、异常捕获、finally、异常抛出、自定义异常

    编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...

  4. java异常类

    package shb.java.exception; /** * 测试异常类 * @Package:shb.java.exception * @Description: * @author shao ...

  5. Java异常类(Throwable)

    一.异常类体系 二.异常类由来与定义 [异常类的由来]:Java把程序在运行时出现的各种不正常情况也看成了对象, 提取属性和行为进行描述,比如异常名称,异常信息,异常发生位置,从而形成了各种异常类 [ ...

  6. Java异常类复习总结

    个人理解先行: 异常类是当在程序出现问题时抛出的一个警告.提示你程序设计或者代码有存在错误的地方. 异常类和Error都继承自Throwable, Throwable继承自Object类. Runti ...

  7. 课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类

    异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象.例如:数组越界和被0除. 代码验证: package test ...

  8. java -> 异常类与自定义异常

    异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...

  9. java异常类的妙用

    异常类的妙用   以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0 ...

随机推荐

  1. QT--QSocketNotifier类介绍

      QSocketNotifier 用来监听系统文件操作,将操作转换为Qt事件进入系统的消息循环队列.并调用预先设置的事件接受函数,处理事件. 一共存在3类事件:read,write,exceptio ...

  2. thinkphp+layui多图上传(1)thinkphp5+layui实现多图上传保存到数据库,可以实现图片自由排序,自由删除。

    公共css代码 <style> .layui-upload-img { width: 90px; height: 90px; margin: 0; } .pic-more { width: ...

  3. 剑指offer——54数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  4. hdu6390 /// 欧拉函数+莫比乌斯反演 筛inv[] phi[] mu[]

    题目大意: 给定m n p 求下式   题解:https://blog.csdn.net/codeswarrior/article/details/81700226 莫比乌斯讲解:https://ww ...

  5. c# mvc 简洁大气官网---源码

    结构

  6. HTTP信息头处理器

    就是HTTP请求头-Header

  7. @value传值到static字段

    解决办法: 1.将这两个私有属性的set方法从私有变成公开(private -->>> public); 2.生成这两个静态属性的set方法: 3.将原来在静态属性上的@Value( ...

  8. Ansible介绍

    第一章 ansible服务介绍 1.1 ansible批量管理服务概述 是基于python语言开发的自动化软件工具 是基于SSH远程管理服务实现远程主机批量管理 1.2 ansible批量管理服务意义 ...

  9. Java.util.Map的实现类有那些?

    1.HashMap 2.Hashtable 3.LinkedHashMap 4.TreeMap

  10. 自行制作yum源仓库

    背景 客户服务器为内网机器,centos7系统,且无法与外网连接.需要部署对应的LANMP环境及其它软件 解决思路 1.在阿里云服务器,利用阿里云的yum源仓库,下载对应软件及关联软件. 2.在客户机 ...