Java 异常(一) 异常概述及其架构-阿里云开发者社区

开发者社区> 幸运码发放> 正文

Java 异常(一) 异常概述及其架构

简介:
+关注继续查看

Java 异常(一) 异常概述及其架构

一、异常概述
(一)、概述
Java异常是Java提供的一种识别及响应错误的一致性机制。异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答 what, where, why 这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出。

(二)、异常体系
异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang.Throwable,其下有两个子类:java.lang.Error与java.lang.Exception,平常所说的异常指java.lang.Exception。

Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。

1、Throwable:Throwable是 Java 语言中所有错误或异常的超类。Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。

Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

Throwable常用API:

public void printStackTrace() // 打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置。
public String getMessage() // 获取发生异常的原因。
public String toString() // 获取异常的类型和异常描述信息。
2、Error:严重错误Error,无法通过处理的错误,只能事先避免。

3、Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。

(三)、异常分类
我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。

异常主要分为两大类:编译期异常和运行期异常。

编译期异常:checked异常。在编译期,就会检查,如果没有处理异常,则编译失败(如日期格式化异常)。

特点: Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。

运行期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)(如数学异常)。

特点: Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。

虽然Java编译器不会检查运行时异常,但是我们也可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。

如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

二、异常处理
Java异常处理机制用到的几个关键字:try、catch、finally、throw、throws。

try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch:用于捕获异常。catch用来捕获try语句块中发生的异常。
finally:finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw:用于抛出异常。
throws:用在方法签名中,用于声明该方法可能抛出的异常。
三、异常注意点
(一)、finally中的异常会覆盖(消灭)前面try或者catch中的异常
不要在fianlly中使用return。
不要在finally中抛出异常。
减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。
将尽量将所有的return写在函数的最后面,而不是try ... catch ... finally中。
(二)、多个异常使用捕获
多个异常分别处理。
多个异常一次捕获,多次处理。
多个异常一次捕获一次处理。
一般情况下,一般我们是使用一次捕获多次处理方式,如下代码

try{

 // 编写可能会出现异常的代码

}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.

 // 处理异常的代码
 //记录日志/打印异常信息/继续抛出异常

}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.

 // 处理异常的代码
 //记录日志/打印异常信息/继续抛出异常

}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

三、实例
(一)、try - catch用法
try - catch 必须搭配使用,不能单独使用。

public class ExceptionDemo {

public static void main(String[] args) {
    try {
        int i = 10 / 0;// 除数不能为0,此行会抛出 ArithmeticException 异常
        System.out.println("i = " + i);// 抛出异常后,此行不会执行
    }catch(ArithmeticException e) { // 捕获 ArithmeticException 异常
        // 在catch 代码块处理异常
        e.printStackTrace(); // 异常最详细信息
        System.out.println("e.getMessage() : " + e.getMessage());// 发生异常的原因
        System.out.println("e.toString() : " + e.toString());  // 获取异常的类型和异常描述信息
    }
}

}

(二)、finally 用法
try - catch - finally搭配使用,或者 try - finally 搭配使用。

public class ExceptionDemo {

public static void main(String[] args) {
    // try-catch-finally搭配使用
    try {
        int[] arr = {1,2,3};
        int i = arr[3];// 数组索引越界,此行会抛出 ArrayIndexOutOfBoundsException 异常
        System.out.println("i = " + i);// 抛出异常后,此行不会执行
    }catch(ArithmeticException e) { // 捕获 ArithmeticException
        System.out.println(e.getMessage());// 发生异常的原因
        System.exit(0); // 程序强制退出,finally 代码块不会执行
    }finally {// 除了程序强制退出,如(System。exit(0)),无论是否发生异常,finally 代码块总会执行
        System.out.println("this is finally");
    }
    
    // try-finally搭配使用
    try {
        int[] arr = {1,2,3};
        int i = arr[3];// 数组索引越界,此行会抛出 ArrayIndexOutOfBoundsException 异常
        System.out.println("i = " + i);// 抛出异常后,此行不会执行
    }finally { 
        // 无论是否发生异常,finally 代码块总会执行
        System.out.println("this is finally");
    }
}

}

注意点:

try-catch-finally 搭配:这种形式捕获异常时,开发者可以在 catch 代码块中处理异常(如打印日志、日志记录等),异常处理权在开发者。
try-finally 搭配:这种形式捕获异常时,默认抛出给 JVM 处理,JVM默认处理时调用 e.printStackTrace() 方法打印异常详细信息。
finally 代码块:除非程序强制退出,否则无论程序是否发生异常,finally 代码块总会执行。
finally 中抛出异常会覆盖(消灭)前面 try 或者 catch 中的异常,尽量避免在 finally 代码块中抛出异常。
如果 try 中和 finally 中都有 return 语句,程序会先执行 finally 中的 return 语句,然后程序块运行结束,而不会执行 try 中的 return 语句。所以尽量不在finally中使用 return 语句。
(三)、throw 用法
throw 是用于抛出异常,将这个异常对象传递到调用者处,并结束当前方法的执行

public static void main(String[] args) {
  try {
    int i = 10 / 0;
    System.out.println("i = " + i);
  }catch(ArithmeticException e) {
    // 抛出异常,传递自定义异常信息提示
    // 默认抛出给 JVM 处理打印异常详细信息
    throw new ArithmeticException("除数不能为0");
  }
}

(四)、throws 用法
throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。

public class ExceptionDemo {

public static void main(String[] args) {
    demo();
}
public static void demo() throws ArrayIndexOutOfBoundsException{
    try {
        int[] arr = {1,2,3};
        int i = arr[3];
        System.out.println("i = " + i);
    }catch(ArrayIndexOutOfBoundsException e) { 
       System.out.println(e.toString());
    } 
}

}

原文地址https://www.cnblogs.com/lingq/p/12942895.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java语言程序设计 上机实验5 异常
Java语言程序设计 上机实验5 实验目的: 理解异常的概念,掌握Java的异常处理机制、常见异常的捕获方法、自定义异常及其抛出和捕获方法。 实验内容: 常见异常的捕获: 编写一个程序,分别生成ArrayIndexOutOfBoundsException类型和NumberFormatException类型的异常;然后改写程序,对这两种类型的异常进行捕获并合理地处理。
1477 0
Java基础-01总结概述,dos,功能键,path
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:计算机概述(了解) (1)计算机(2)计算机硬件(3)计算机软件系统软件:window,linu
1512 0
JavaScript基础(一)概述
JavaScript 概述 JS作用 验证表单(以前的网速慢) 页面特效(PC端的网页效果) 移动端(移动web和app) 异步和服务器交互(AJAX) 服务端开发(nodejs) 语言类型 js是一种脚本语言,不仅是脚本语言还是弱类型的脚本语言。
1252 0
关于异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
原文:关于异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 关于Microsoft.CSharp.RuntimeBinder.RuntimeBinderException的异常一般来自于两种, 第一种: Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported 解决它的办法是,直接在项目引用中添加 Micorsoft.Csharp 就可以了。
1394 0
从零开始学 Web 之 JavaScript(一)JavaScript概述
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程。此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注。在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。
1917 0
java基础学习_概述_day01总结
======================================================================================================================================================...
1508 0
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.1 XML概述
本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第3章 ,第3.1节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1448 0
《Java安全编码标准》一第 1 章 概  述
本节书摘来自华章出版社《Java安全编码标准》一书中的第1章,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看
847 0
JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 一.异常的概述 异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法 //公共的 类 类名 public .
1321 0
+关注
幸运码发放
阿里云优惠码阿里云推荐券bieryun.com
171
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载