本节主要内容是对 Java 的异常处理进行讲解,主要包含以下知识点: 异常分类 声明及抛出 捕获异常 自定义异常 * 异常堆栈

异常概述

对于程序的错误以及外部环境能够对用户造成的影响,我们应当及时报告并且以适当的方式来处理这个错误。

异常都是从Throwable类派生出来的,而Throwable类是直接从Object类继承而来。你可以在 Java SE 官方 API 文档中获取更多关于它们的知识。

异常通常有四类:

  • Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理
  • Exception:可以处理的异常
  • RuntimeException:可以捕获,也可以不捕获的异常
  • 继承 Exception 的其他类:必须捕获,通常在 API 文档中会说明这些方法抛出哪些异常

平时主要关注的异常是 Exception 下的异常,而 Exception 异常下又主要分为两大类异常,一个是派生于 RuntimeExcption 的异常,一个是除了 RuntimeExcption 体系之外的其他异常。 RuntimeExcption 异常(运行时异常)通常有以下几种:

  • 错误的类型转换
  • 数组访问越界
  • 访问 null 指针
  • 算术异常

一般来说,RuntimeException 都是程序员的问题。 非 RuntimeException(受查异常)一般有:

  • 打开一个不存在的文件
  • 没有找到具有指定名称的类
  • 操作文件异常

受查异常是编译器要求必须处理的异常,必须使用 try catch 处理,或者向上抛出,给上层处理。

抛出异常

异常抛出语法:

throw new 异常名();

public class ThrowTest {public static void main(String[] args) {Integer a = 1;Integer b = null;//当a或者b为null时,抛出异常if (a == null || b == null) {throw new NullPointerException();} else {System.out.println(a + b);}}
}运行结果:
Exception in thread "main" java.lang.NullPointerExceptionat ThrowTest.main(ThrowTest.java:8)

throws 声明异常

Throws 用于声明异常,表示该方法可能会抛出的异常。如果声明的异常中包括 checked 异常(受查异常),那么调用者必须处理该异常或者使用 throws 继续向上抛出。throws 位于方法体前,多个异常使用,分割。

import java.io.FileInputStream;
import java.io.FileNotFoundException;public class ThrowsTest {public static void main(String[] args) throws FileNotFoundException {//由方法的调用者捕获异常或者继续向上抛出throwsTest();}public static void throwsTest() throws FileNotFoundException {new FileInputStream("/home/project/shiyanlou.file");}
}

捕获异常

通常抛出异常后,还需要将异常捕获。使用try和catch语句块来捕获异常,有时候还会用到finally。 对于上述三个关键词所构成的语句块,try语句块是必不可少的,catch和finally语句块可以根据情况选择其一或者全选。你可以把可能发生错误或出现问题的语句放到try语句块中,将异常发生后要执行的语句放到catch语句块中,而finally语句块里面放置的语句,不管异常是否发生,它们都会被执行。

public class CatchException {public static void main(String[] args) {try {// 下面定义了一个try语句块System.out.println("I am try block.");Class<?> tempClass = Class.forName("");    // 声明一个空的Class对象用于引发“类未发现异常”System.out.println("Bye! Try block.");} catch (ClassNotFoundException e) {// 下面定义了一个catch语句块System.out.println("I am catch block.");e.printStackTrace();//printStackTrace()的意义在于在命令行打印异常信息在程序中出错的位置及原因System.out.println("Goodbye! Catch block.");} finally {// 下面定义了一个finally语句块System.out.println("I am finally block.");}}
}结果:I am try block.
I am catch block.
java.lang.ClassNotFoundException:at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Unknown Source)at CatchException.main(CatchException.java:8)
Goodbye! Catch block.
I am finally block.

多个异常情况

在一段代码中,可能会由于各种原因抛出多种不同的异常,而对于不同的异常,我们希望用不同的方式来处理它们,而不是笼统的使用同一个方式处理,在这种情况下,可以使用异常匹配,当匹配到对应的异常后,后面的异常将不再进行匹配

在处理异常时,并不要求抛出的异常同 catch 所声明的异常完全匹配,子类的对象也可以匹配父类的处理程序。比如异常 A 继承于异常 B,那么在处理多个异常时,一定要将异常 A 放在异常 B 之前捕获,如果将异常 B 放在异常 A 之前,那么将永远匹配到异常 B,异常 A 将永远不可能执行,并且编译器将会报错。

自定义异常

自定义一个异常类非常简单,只需要让它继承 Exception 或其子类就行。在自定义异常类的时候,建议同时提供无参构造方法和带字符串参数的构造方法,后者可以为你在调试时提供更加详细的信息。

// MyAriException.java
public class MyAriException extends ArithmeticException {//自定义异常类,该类继承自ArithmeticExceptionpublic MyAriException() {}//实现默认的无参构造方法public MyAriException(String msg) {super(msg);}//实现可以自定义输出信息的构造方法,将待输出信息作为参数传入即可
}
// ExceptionTest.java
import java.util.Arrays;public class ExceptionTest {public static void main(String[] args) {int[] array = new int[5];//声明一个长度为5的数组Arrays.fill(array, 5);//将数组中的所有元素赋值为5for (int i = 4; i > -1; i--) {//使用for循环逆序遍历整个数组,i每次递减if (i == 0) {// 如果i除以了0,就使用带异常信息的构造方法抛出异常throw new MyAriException("There is an exception occured.");}System.out.println("array[" + i + "] / " + i + " = " + array[i] / i);// 如果i没有除以0,就输出此结果}}
}

异常堆栈

当异常抛出后,我们可以通过异常堆栈追踪程序的运行轨迹,以便我们更好的DEBUG。

java string逆序_Java学习笔记(八)——异常相关推荐

  1. java string逆序_java经典入门算法题,java初学者必备

    java经典入门算法题 开头求关注警告 喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资 料的也可以私信我! 祝关注我的人都:身体健康,财源广进,福如东海,寿比 ...

  2. java多态怎么学_Java学习笔记---多态

    在面向对象的程序设计中,多态是继数据抽象和继承之后的第三种基本特性: 多态通过分离做什么(基类对象)和怎么做(导出类对象),从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能 ...

  3. java list逆序_Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用...

    list升序,降序,逆序 Listlist =new ArrayList(); //如果list是 5 7 2 6 8 1 4 1.升序: Collections.sort(list) //list: ...

  4. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  5. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  6. java list逆序_Java使用ListIterator逆序ArrayList

    对于列表而言,除了Iterator,还提供了一个功能更加强大的ListIterator.它可以实现逆序遍历列表中的元素.本示例将使用其逆序遍历ArrayList. 思路分析:要逆序遍历某个列表,首先要 ...

  7. java数组逆序_Java 数组的排序、逆序

    数组的排序.逆序测试数据 public static void main (String[] args) { // 数组逆序 int[] arr = {1,2,3,4,5,6,7}; reverse( ...

  8. java类的静态变量调用_Java学习笔记八---类的静态变量与静态方法的访问与调用方式...

    静态变量又称类变量,静态方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些静态成员.不需要创建任何对象,静态成员在类装载时就已初始化了,整个运行 ...

  9. java函数定义的要素_Java学习笔记八(方法)

    方法是解决一类问题的有序步骤的集合.将程序中共有的代码放在一起,然后统一调用这一个代码,那么这个代码块则称为方法. 方法尽可能要独立,一个方法最好只解决一个问题. 1.方法的优点 <1>减 ...

最新文章

  1. spring ioc原理(看完后大家可以自己写一个spring)
  2. RxSwift技术路线与参考资料
  3. redis的通用命令 || redis持久化机制:(RDB  ||  AOF)
  4. 2015年百度一面试题
  5. 【总结】循序渐进,有三AI不得不看的技术综述(超过100篇核心干货)
  6. [转载]为什么使用 SLF4J 而不是Log4J来做Java 日志
  7. linux-basic(13)学习shell script
  8. 存储过程与函数oracle
  9. svn服务器安装与配置
  10. 堆 堆栈 java_java的栈和堆
  11. sublime python调试_如何用sublime调试程序
  12. vim编辑器中常用的命令
  13. 矢量的模 matlab,单模光纤基模色散曲线矢量分析的Matlab实现
  14. 简单方法去除图片水印图文教程
  15. HashMap,LinkedHashMap,TreeMap应用
  16. bcd 初始化库系统卷失败_中级|软考题库每日一练|2.24
  17. html header设置语言,HTML header
  18. xshell安装及使用
  19. 揭个人信息黑产链条:含50多种交易大项 可私人定制
  20. 【BZOJ3893】【Usaco2014 Dec】Cow Jog 乱搞

热门文章

  1. WCF错误远程服务器返回了意外响应: (413) Request Entity Too Large。解决方案
  2. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
  3. win10安装JDK cmd中可以运行java,但不能用javac,解决方案
  4. nginx配置解决vue单页面打包文件大,首次加载慢的问题
  5. 关于共享单车的供电问题如何解决?
  6. java.util.ConcurrentModificationException异常原因及解决方法
  7. centos7 中文乱码问题解决方法
  8. 如何在推送后压缩git中的提交?
  9. 如何使python等待按键
  10. 如何从“查找”中排除所有“拒绝权限”消息?