1.介绍

在开发过程中。都会遇到程序执行时的异常,比如逻辑错误、硬件故障等,本篇博客将会具体的介绍一下Java中的异常处理机制。

2.Try和Catch捕获异常

我们在处理异常过程中经经常使用到的就是Try和Catch语句了。try语句块可以指出可能出现的异常,随后通过一个或者多个Catch语句块来捕获。

2.1.简单的Try和Catch语法

  1. package com.RuntimeException;
  2.  
  3. public class Sample11_1
  4. {
  5. public static void main(String[] args)
  6. {
  7. //被监视的代码块
  8. try
  9. {
  10. //创建数组对象
  11. int[] a=new int[4];
  12. System.out.println("整型数组创建完成!
  13.  
  14.  
  15. ");
  16. //訪问数组元素
  17. a[3]=9;
  18. System.out.println("整型数组中第四个元素的数值为"+a[3]+"!!!");
  19. }
  20. //处理下标越界异常
  21. catch(ArrayIndexOutOfBoundsException aiobe)
  22. {
  23. //打印提示信息
  24. System.out.println("这里出现的错误类型是:数组下标越界。。");
  25. }
  26. //处理空引用异常
  27. catch(NullPointerException npe)
  28. {
  29. //打印提示信息
  30. System.out.println("这里出现的错误类型是:空引用!
  31.  
  32. !");
  33. }
  34. System.out.println("主程序正常结束!
  35.  
  36. !!
  37.  
  38. ");
  39. }
  40. }

2.2.异常的传播过程

在异常的传播过程中,假设没有Catch语句进行捕获的话,异常将会沿着方法的调用栈一直向上传播。

假设传播的过程中一直没有Catch语句块捕获的话,则终于传播到main方法中。最后由Main方法进行抛出,由java执行时的环境来处理。

  1. package com.RuntimeException;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5.  
  6. public class Sample11_2 {
  7.  
  8. public static void main(String[] args) {
  9.  
  10. // 主方法中调用method1方法
  11. method1();
  12. }
  13.  
  14. static void method1() {
  15. // method1方法中调用method2方法
  16. method2();
  17. }
  18.  
  19. static void method2() {
  20. int[] a = new int[3];
  21. // 产生数据下标越界错误
  22. a[4] = 12;
  23. System.out.println("OK!!!");
  24. }
  25.  
  26. }

2.3.finally语句块的作用

某些特殊情况下,当程序出错后,不管抛出异常与否都必须保证运行。比如。打开了一个数据库连接。不管处理过程中是否抛出异常,最后都要关闭连接。不能因为抛出异常就影响了其运行。那么此时能够把必需要运行的语句放置到finally中。

  1. package com.RuntimeException;
  2.  
  3. public class Sample11_3 {
  4.  
  5. public static void main(String[] args)
  6. {
  7. //受监视的代码块
  8. try
  9. {
  10. //创建长度为4的int型数组
  11. int[] a=new int[4];
  12. System.out.println("整型数组创建完成!!
  13.  
  14. ");
  15. //为数组最后一个元素赋值
  16. a[3]=9;
  17. System.out.println("整型数组中第四个元素的数值为"+a[5]);
  18. }
  19. //处理空引用异常代码块
  20. catch(NullPointerException npe)
  21. {
  22. //打印提示信息
  23. System.out.println("这里出现的错误类型是:空引用!
  24.  
  25. !");
  26. }
  27. //finally块
  28. finally
  29. {
  30. //打印提示信息
  31. System.out.println("这里是finally块。不管是否抛出异常,这里总能运行!
  32.  
  33. ");
  34. }
  35. }
  36. }

2.4.try、catch以及finally之间须要注意的问题

~没有catch的情况下。finally必须紧跟try

~catch和finally不能同一时候省略

~try、catch以及finally块之间不能插入其它代码

3.异常的层次结构

当发生异常的时候。java会将异常包装成一个异常类的对象,并将其引用作用參数传递给对应的catch语句来处理。在java中异常分为两部分捕获异常和未捕获异常

3.1.异常层次图

~Throwable类有两个直接子类,Error与Exception类,Exception类有一个子类RuntimeException。

~捕获异常一般都是由外界因素产生,而且是能够恢复的,并非由程序引起的,这些异常程序本身没有问题也可能会产生。

~未捕获异常,即Error类以及其子类以及RuntimeException类及其子类

~捕获的异常类型,都须要在程序中进行捕获处理。

3.2.异常的显性再抛出

对于捕获的异常,在方法声明时抛出后。能够在当中通过Try以及Catch再次抛出。

  1. package com.RuntimeException;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5.  
  6. public class Sample11_10 {
  7. // 定义connect方法将有可能抛出IOException异常
  8. public void connect() throws IOException {
  9.  
  10. // 受监视的代码
  11. try {
  12. // 创建ServerSocket对象
  13. ServerSocket ss = new ServerSocket(9999);
  14. }
  15. // 异常处理代码
  16. catch (IOException e) {
  17. // 将异常抛出
  18. throw e;
  19. }
  20. }
  21. }

3.3.隐形再抛出

假设仅仅是想把异常再抛出的话,不必使用显性再抛出,直接使用隐形再抛出就可以。

  1. package com.RuntimeException;
  2.  
  3. import java.io.IOException;
  4. import java.net.ServerSocket;
  5.  
  6. public class Sample11_12 {
  7. //声明方法myFunction将有可能抛出IOException异常
  8. public static void myFunction() throws IOException
  9. {
  10. //创建ServerSocket对象
  11. ServerSocket ss=new ServerSocket(9999);
  12. }
  13. public static void main(String[] args)
  14. {
  15. //受监视的代码
  16. try
  17. {
  18. //调用myFunction方法
  19. myFunction();
  20. }
  21. //异常处理代码
  22. catch(IOException e)
  23. {
  24. //打印调用栈信息
  25. e.printStackTrace();
  26. }
  27. System.out.println("恭喜你。程序正常执行结束!!!
  28.  
  29. ");
  30. }
  31. }

4.自己定义异常类

我们也能够自己定义自己的异常类来满足自己使用时的需求。

4.1.创建自己定义异常类

一般创建自己定义异常类的话,仅仅需继承Exception或者其它捕获异常类,经常使用到的方法例如以下

~printStackTrace():该方法将在控制台打印异常调用栈的信息

~toString():该方法将返回该异常对象的字符串表示

~getMessage():返回异常中携带的出错信息。

  1. package com.RuntimeException;
  2. class MyException extends Exception
  3. {
  4. //两种版本号的构造器
  5. public MyException()
  6. { }
  7. public MyException(String msg)
  8. {
  9. super(msg);
  10. }
  11. }
  12. //主类
  13. public class Sample11_15
  14. {
  15. public static void main(String[] args)
  16. {
  17. //创建自己定义异常类对象
  18. MyException me=new MyException("自己定义异常类");
  19. me.printStackTrace();
  20. //调用继承的方法
  21. System.out.println("自己定义异常对象的字符串表示为:“"+me.toString()+"”。
  22.  
  23. ");
  24. System.out.println("自己定义异常对象携带的出错信息为:“"+me.getMessage()+"”。");
  25. }
  26. }

4.2.同一时候捕获多次异常

假设try语句后要跟多个catch的话,最后catch语句的先后顺序满足从小到大的范围进行捕获,也就是异常先从子类開始。慢慢的递增。

Java读书笔记一(异常处理)的更多相关文章

  1. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  2. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  3. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  4. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...

  5. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  6. Java读书笔记1

    Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...

  7. java读书笔记二

    这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...

  8. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  9. 【java读书笔记】——java的异常处理

    程序在实际环境的执行过程中.安全成为须要首先考虑的重要因素之中的一个.这也是用户和程序猿最关心的问题.同一时候,Java语言健壮性也体如今了可以及时有效地处理程序中的错误.准确的说是Java的异常处理 ...

随机推荐

  1. [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)

    c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...

  2. snprintf

    snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...).   将可变参数 “…” 按照format的 ...

  3. FastDFS架构

    1.什么是 FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用Fas ...

  4. 主流框架(SSH及SSM)配置文件的模板头文件

    SSH三大框架整合配置头文件模板如下: 一:Spring配置文件(beans.xml)模板:<beans    xmlns="http://www.springframework.or ...

  5. Qt之qInstallMessageHandler(输出详细日志)

    简述 安装之前已定义的消息处理程序,返回一个指向前一个消息处理程序. 消息处理程序是一个函数,用于打印调试信息.警告信息.严重错误和致命的错误的消息.Qt库(debug模式)包含成百上千的警告信息打印 ...

  6. hdu1281 棋盘游戏 --- 最大匹配

    给一个矩形棋盘,上面有一些空格点,能够放象棋中的"车", 现给出空格的坐标,求最多能够放多少个"车"使他们互不攻击(依据象棋规则,每行每列至多仅仅能放一个), ...

  7. 2)Win10-UWA开发 API參考 - 1

    孙广东  2015.8.23 大多数 Windows 执行时 API 如今适用于 Windows Phone 应用商店应用以及 Windows 应用商店应用,这意味着当你创建同一时候面向 Window ...

  8. Unique path ii

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  9. ora-01157怎么解决

    在数据库startup时,出现以下两个错误:ora-01157:cannot identify/lock data file 8 -see DBWR trace fileora-01110:data ...

  10. 持久层框架Clone

    Clone框架:http://www.52chloe.com/Wiki/Document/3324802610879266816 Clone框架支持多种数据库,我用的是sql server 基本查询: ...