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

在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. CSS:CSS 布局 - 水平 & 垂直对齐

    ylbtech-CSS:CSS 布局 - 水平 & 垂直对齐 1.返回顶部 1. CSS 布局 - 水平 & 垂直对齐 水平 & 垂直居中对齐 元素居中对齐 要水平居中对齐一个 ...

  2. 我看Spring MVC系列(一)

    1.Spring MVC是什么: Spring MVC:Spring框架提供了构建Web应用程序的全功能MVC模块. 2.Spring helloWorld应用(基于Spring 4.2) 1.添加S ...

  3. Bagging vs Boosting vs Stacking

    原文地址:https://www.jianshu.com/p/9dacdc88d3ec Bagging 用于减小方差. 使用训练数据的不同随机子集(大小常等于训练数据,采用不放回的方式进行抽取)来训练 ...

  4. HDU 6628 permutation 1 (暴力)

    2019 杭电多校 5 1005 题目链接:HDU 6628 比赛链接:2019 Multi-University Training Contest 5 Problem Description A s ...

  5. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  6. 剑指offer——69队列的最大值

    题目: 队列的最大值.请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和pop_front的时间复杂度都是O(1). 题解: 使用队列,操持队列的排序为从大到小的顺 ...

  7. hdu6393 /// 树链剖分

    题目大意: 给定n q 在n个点n条边的图中 进行q次操作 0 k x 为修改第k条边的值为x 1 x y 为查询x到y的最短路 https://blog.csdn.net/nka_kun/artic ...

  8. springbot项目中使用继承

    package com.example.demo.controller; import com.sun.org.apache.bcel.internal.generic.NEW; import org ...

  9. 伪类checked

    困惑了好久的复选框自定义样式终于有了谜底,原来就是一个 :checked 伪类 他的意思就是 匹配任意被勾选/选中的radio(单选按钮),chexked(复选框),或者option(select项) ...

  10. Dubbo管理端工具

    要得到dubbo的管理端工具其实很简单,只需要下面几步: 1.下载源码:我下载的是dubbo-dubbo-2.5.7.zip . 2.使用maven命令编译源码,得到war包: 将下载的dubbo-d ...