文档章节

Java基础进阶_day05_(异常)

S
 Sunmos
发布于 2017/05/13 00:18
字数 2934
阅读 0
收藏 0

Java基础进阶_day05_(异常)

1. 异常

1.1 异常概述

概念: 程序出现了不正常的现象.
异常分类

# Throwable类是Java语言中所有错误或异常的超类,Throwable有两个子类Error和Exception.
  * 严重问题:Error,内出溢出等,修正代码;
  * 一般问题:Exception,Exception分为两种
 编译期异常:除RuntimeException外的Exception,必须处理;
 运行期异常:RuntimeException,一般不进行处理,需要修正代码.
  * 异常处理本质: 当程序出现异常,我们如果不进行处理,Java虚拟机会做出默认的处理(将异常的名称和原因显示在控制台).

1.2 异常的处理

1.2.1 异常处理的分类
# 编译期异常:必须进行处理,否则无法编译通过;
# 运行期异常:调用者可以不用处理该方法抛出的异常.
 Java程序中可以使用try...catch...fianlly和throws方式处理异常.
1.2.2 try…catch…finally处理异常

处理异常的格式

# try...catch...finally方式(finally可以省略,catch可以有多个):
  * 格式1: 
 try{
 可能出现问题的代码;
 }catch(异常类名 变量名){
 针对问题的处理代码;
 }fially{
 释放资源;
 }
  * 格式2: 
 try{
 可能出现问题的代码;
 }catch(异常类名 变量名){
 针对问题的处理代码;
 }
  * 格式3: 异常类名间是平级关系
 try{
 可能出现问题的代码;
 }catch(异常类名1 变量名1){
 针对问题的处理代码1;
 } catch(异常类名2 变量名2){
 针对问题的处理代码2;
 }...
 fially{
 释放资源;
 }
  * 格式4: 此格式是为了释放资源
 try{
 可能出现问题的代码;
 }fially{
 释放资源;
 }
  * 格式5: JDK1.7版本开始
 try{
 可能出现问题的代码;
 } catch(异常类名1 | 异常类名2... 变量名){
 针对问题的处理代码;
 }fially{
 释放资源;
 }
 catch中的异常类名间必须是平级关系,不能是子父类关系.

注意事项

# try里面的代码越少越好(Java虚拟机会开辟资源进行管理这些代码);
# catch中一般要求给出处理或提示;
# try里面的某一语句出现异常,则直接执行对应的catch语句,出现异常语句后面的代码不会执行;
# catch中的异常类能明确的一定要明确到具体的异常类,如果不能确定异常出现的种类,可以直接使用Exception类;
# 多个catch中的异常类时,平级(同属于一个父类)的异常类无先后顺序,不平级的异常类(子父类关系),父类在后,子类在前(如果父类异常在前(多态),子类异常就无法执行,没有意义).

案例代码

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ExceptionDemo {
    public static void main(String[] args) {
        // 异常分类
        method();
        // 异常处理
        method2();
    }
    // 异常分类
    public static void method() {
        // 编译期异常(a.txt文件可能不存在),必须进行处理
        // FileWriter fw = new FileWriter("a.txt");报错

        // 运行期异常(除数为零),可以不用处理
        int result = 10 / 0;
    }
    // 异常处理(编译期异常和运行期异常)
    public static void method2() {
        // try方式处理异常
        // 编译期异常,格式1
        try {
            // 可能出现异常的语句
            FileWriter fw = new FileWriter("a.txt");
            FileReader fr = new FileReader("a.txt");
            // 如果上面语句出现了异常,则该try块中下面的所有代码不会执行
            System.out.println("上面的代码没有出现异常");
        } catch (FileNotFoundException e) {
            // 打印出现异常的信息,也可以不打印
            // 创建写文件对象语句可能出现问题的异常
            e.printStackTrace();
            // 可以针对异常问题进行处理
            System.out.println("要读取的文件不存在");
        } catch (IOException e) {
            // 创建写文件可能出现的异常
            e.printStackTrace();
            // 可以针对异常问题进行处理
            System.out.println("要写文件的路径不存在");
        } finally {
            // 这里代码用于处理释放资源,不管会不会处理异常,这里的代码都会执行
            // 只有在此代码块之前推出JVM后,此代码块才不会执行
            System.out.println("释放资源");
        }
        // jdk1.7版本后可以将多个异常放在一个catch语句中,使用|分隔
        // 但是多个异常类间必须是平级关系,不能有继承关系,可以使用父类的异常类代替所有的异常类
        try {
            // 可能出现异常的语句
            FileReader fr = new FileReader("a.txt");
            System.out.println(10 / 0);
            // 如果上面语句出现了异常,则该try块中下面的所有代码不会执行
            System.out.println("上面的代码没有出现异常");
        } catch (FileNotFoundException | ArithmeticException e) {
            e.printStackTrace();
            System.out.println("代码出现异常");
        }
    }
}
1.2.3 throws方式处理异常
# throws方式处理异常:是将异常抛出:定义方法时将可能出现的问题交给调用者去处理,通过在方法声明上使用throws标识.
  * 格式: throws  异常类名    
 注意:这个格式是放在方法声明的括号后面的(异常可以有多个,使用逗号隔开).
  * 抛出异常分类(方法中):
 编译期异常:必须进行处理,否则无法编译通过, 在方法声明上将异常抛出,调用者必须进行异常的处理(调用者可以使用try...catch方式,也可以使用throws抛出);
 运行期异常:调用者可以不用处理该方法抛出的异常.

案例代码

import java.io.FileWriter;
import java.io.IOException;
/* * throws抛出异常 */
public class ExceptionDemo2 {
    public static void main(String[] args) {
        // 编译期异常,调用有异常的method方法,必须进行处理
        // 在主方法中一般使用try进行处理,不直接抛给主方法
        // 原因是如果抛给主方法,就是直接让虚拟机处理,
        // 而虚拟机的处理就是终止程序的运行,则出现异常的语句后的语句无法执行
        try {
            method();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 运行期异常,可以不用进行处理,如果处理就使用try方式
        show();
    }
    // 编译期异常,调用method2方法,必须进行异常处理
    // 针对异常可以使用try...catch语句,也可以继续抛出
    public static void method() throws IOException {
        method2();
    }
    // 编译期异常,必须进行处理,抛出后,谁调用谁处理
    public static void method2() throws IOException {
        FileWriter fw = new FileWriter("a.txt");
    }
    // 运行期异常,可以不处理
    public static void show() throws ArithmeticException {
        show2();
    }// 运行期异常,可以不处理
    public static void show2() throws ArithmeticException {
        // 除数不能为零的运行期异常,处理时可以抛出,也可以使用try方式
        System.out.println(10 / 0);
    }
}

1.3 异常类Throwable的常见方法

public String getMessage():返回此异常的详细消息字符串.
public String toString():返回此异常的简短描述. 结果是以下字符串的串联:
      此对象的类的name;
      ": "(冒号和一个空格);
      调用此对象getLocalizedMessage()方法的结果.
public void printStackTrace():将此异常的类名和异常信息及异常出现的位置的信息输出在控制台.

案例代码

/* * 异常类的常见方法 */
public class ExceptionDemo1 {
    public static void main(String[] args) {
        // 异常类的常见方法
        method();
    }
    // 异常类的常见方法
    public static void method() {
        try {
            // 运行期异常(除数为零),可以不用处理
            int result = 10 / 0;
        } catch (Exception e) {
            // public String getMessage():返回此异常的详细消息字符串.
            System.out.println(e.getMessage());
            // public String toString():返回此异常的简短描述.
            System.out.println(e.toString());
            // public void printStackTrace():
            // 将此异常的类名和异常信息及异常出现的位置的信息输出在控制台.
            e.printStackTrace();
        }
    }
}

1.4 自定义异常

# 自定义异常类:定义异常类继承异常类(编译期异常Exception和运行时异常RuntimeException).
  * 自定义异常类只需要继承异常类,然后给出无参构造方法和有参构造方法(参数为错误信息,super传递给父类)即可;
  * 使用throw关键将自定义异常抛出(throw new 自定义异常类名(自定义异常信息);).

案例代码

/* * 自定义异常类 */
public class ExceptionDemo3 {
    public static void main(String[] args) {
        // 使用自定义异常类,编译期异常类
        int age = 16;
        if(age < 18) {
            try {
                // 编译异常语句,可以使用try方式和throws方式处理
                throw new MyException("您的年龄不满18岁,禁止上网");
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
        // 使用自定义异常类,运行时异常类,
        // 可以不处理,可以使用try或者throws处理
        if(age < 18) {
            try {
                // 运行异常语句,可以使用try方式和throws方式处理
                throw new MyException("您的年龄不满18岁,禁止上网");
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
        // 使用系统的异常类,自己给出异常提示信息
        if(age < 18) {
            try {
                // 异常语句,可以使用try方式和throws方式处理
                // 自定义错误信息
                throw new RuntimeException("您的年龄不满18岁,禁止上网");
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    }
}
// 自定义异常类,编译期异常类
class MyException extends Exception {
    // 自定义异常类,只需要创建构造方法,将异常提示信息传递给父类即可
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
}
// 自定义异常类,运行时异常类
class MyException2 extends RuntimeException {
    // 自定义异常类,只需要创建构造方法,将异常提示信息传递给父类即可
    public MyException2() {
        super();
    }
    public MyException2(String message) {
        super(message);
    }
}

1.5 throw关键字

# 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出.
# 使用:在方法中的代码对可能出现问题的语句进行判断,如果是异常情况就用(throw 异常类对象)将异常抛出.

1.6 finally关键字

# fianlly关键字:使用try语句的一部分.
  * 特点:被finally控制的语句一定会执行;
  * 注意事项:如果程序执行到finally语句体之前,虚拟机退出了,finally控制的语句就不会执行了;
  * 作用:用于释放资源(IO操作和数据库操作).

1.7 throws和throw的区别

# throws:被动抛出异常
  * 用在方法声明后面,紧跟着是抛出的异常类名;
  * 可以有多个异常类名,用逗号隔开;
  * 表示抛出异常,由该方法的掉用者进行处理;
  * 表示出现异常的一种可能性,并不一定会发生异常.
# throw:主动抛出异常
  * 用在方法体内,紧跟的是异常对象名;
  * 只能抛出一个异常对象名;
  * 表示抛出异常,由该方法体内的语句进行处理;
  * 表示程序抛出了异常,执行throw语句则表示程序一定出现了异常.

1.8 final,finally,finalize的区别

# final:可以修饰类(该类不能被继承),变量(该变量是常量),方法(该方法不能被重写);
# finally:异常处理try语句的一部分,用于释放资源;
# finalize:是Object类的一个方法,用于垃圾回收.

1.9 异常的使用

# 原则:如果功能模块内部能处理则使用try语句,如果不能处理就使用throws将异常抛出给虚拟机处理.
  * try语句和throws区别:
 前者是处理异常,异常处理代码块后的代码可以继续执行(try中的代码块出现异常的语句后的代码不再执行);
 后者是遇到异常将异常抛给虚拟机并停止程序的执行,异常语句的后续代码不会执行.

本文转载自:http://blog.csdn.net/l631106040120/article/details/70217081

共有 人打赏支持
S
粉丝 0
博文 34
码字总数 0
作品 0
成都
私信 提问
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
2018/07/25
0
0
一起来学大数据|为何学习大数据,要先学Java?之茅塞顿开

大数据的就业、工资的水平等等方面都让更多的人投身进入到学习大数据的旗下。 只要你对大数据有兴趣、有精力、敢于尝试,依旧可以开拓出自己的一片天! 其实,我们也不难发现,在外面报班学习...

董黎明
04/07
0
0
GO从入门到进阶教程系列 - 研发高性能ORM框架入门

随着GO语言市场占比越来越高,我也开始转向使用GO开发项目;因为GO有好几大优点,比如容并发与协程,消息通讯,丰富的数据类型,函数多返回值,defer延迟处理机制,高性能易用的http服务,编程规范等等...

aielves
03/16
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
2018/05/09
0
0
Java怎么学?2018最新Java学习路线,技术要求与项目推荐详解!

关注小编吧!! 回顾2017年,java发展的程度超乎了我们的想象,对技术的要求也越来越高,从原先的前端,后端的分布,到现在企业要求的全栈,对于个人能力的要求是逐步提高的,那我们现在究竟...

qq_41781067
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一致性hash和虚拟节点

consistent hashing 算法的原理 consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在key 映射关系,尽可能的满足单调性的要求。 下面就...

群星纪元
27分钟前
2
0
说一下Dubbo 的工作原理?注册中心挂了可以继续通信吗?

面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ、ES、Redis、Dubbo,上来先问你一些思考性的问题、原理,比如 kafka 高可用架...

李红欧巴
38分钟前
19
0
腾讯面试:一条SQL语句执行得很慢的原因有哪些?

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实...

java菜分享
56分钟前
11
0
Java 基本功 之 CAS

本文首发于个人公众号《andyqian》, 期待你的关注! 前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机...

andyqian
59分钟前
5
0
信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互...

shzwork
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部