Java异常类及处理

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

在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几个;

原文地址:https://www.cnblogs.com/Dm920/p/11681802.html

时间: 2024-08-27 19:58:05

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

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

在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到

Java异常类

原文出自:http://blog.csdn.net/hguisu/article/details/6155636  在原文的基础上做优化和编辑. 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图:

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

异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象.例如:数组越界和被0除. 代码验证: package test; import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1, j=0, k; try { k = i/j; // Causes division-by-zero except

java异常类的妙用

以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0.5的框架时,看到AuthenticationException这个异常类(用在验证时)的源码,发现这个异常类除了上述常见的用法外,还把Authentication(验证信息)的做为属性放到了异常类中,当验证出错时AuthenticationException抛出时,Authentication(验证信息)一同被抛出

JAVA 异常类

1.Exception(异常) :是程序本身可以处理的异常. 2.Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,一般不需要程序处理. 3.检查异常(编译器要求必须处置的异常) :  除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常.这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出

java异常类子类和父类的关系

在java 中,当我们子类要重写父类中的方法,如果父类的方法有异常声明,那么子类重写这个方法时候,所要声明的异常不应该比父类的大.只能是小等,或者可以没有.原因如下.假如我们自定意义一个异常: public class MyException extends Exception {public MyException(String message) {}public MyException() {}} 那么我们有一个父类它将有一个方法,将声明抛出这个异常.我们把它做成抽象的(无所谓) publi

下面有关 JAVA 异常类的描述,说法正确的有()

都是Throwable的子类: 1.Exception(异常) :是程序本身可以处理的异常. 2.Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,一般不需要程序处理. 3.检查异常(编译器要求必须处置的异常) :  除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常.这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它

java异常类的使用

1.异常的概念 什么是异常?程序出错分为两部分,编译时出粗和运行时出错.编译时出错是编译器在编译源码时发生的错误: 运行时出错是在编译通过,在运行时出现的错误.这种情况叫异常. 例如:数组越界,除数为0,文件找不到等等. 异常的层次: Object Throwable Error Exception RuntimeException IOException 2.如何解决异常 a.使用try...catch public class UsingTryCatch { public static vo

Core Java 经典笔试题总结(异常类问题)

所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由此总结几个编程规范. 1 class smallT { 2 public static void main(String args[]) { 3 smallT t = new smallT(); 4 int b = t.get(); 5 System.out.println(b); 6 } 7 8