一.异常:

1.1异常分类:

异常对象都是派生于throwable类的实例:

  • Error类说明java运行时存在内存错误或资源耗尽错误,出现这类错误,除了告诉用户,别无他法
  • Exception是需要关注的;它又分为RuntimeExceptionIOException

如果出现了RuntimeException,那么一定是你自己的问题

Error类或RuntimeException类的所有异常称为非受查(uncheck)异常,其他的异常成为受查(check)异常

1.2受查异常:

需要记住在以下情况中应该抛出异常:

  • 调用一个抛出受查异常的方法时,如:FileInputSteam构造器
  • 程序运行时发现错误,利用throw抛出一个受查异常
  • 程序出现错误时,如:数组越界(ArrayIndexOutOfBoundsException)
  • java虚拟机和运行时库内出现的内部错误

如果出现前两种异常之一,则必须告诉程序员调用这个方法可能会出现的异常,如果没有处理器捕获,当前执行的线程就会结束

对于可能被其他人调用的方法,应根据异常规范(exception specification),在方法首部声明者个可能的的异常:

class MyAnimation
{. . .public Image loadImage(String s) throws IOException{. . .}
}    

但是,无需声明java的内部错误,我们无法控制Error.

同样,不应该声明从RuntimeException继承的非受查异常:

class MyAnimation
{. . .void drawImage(int i) throws ArrayIndexOutOfBoundsException {. . .}
}  

这些异常完全在我们的控制之下,与其去说明异常,我们更应该将精力花费在修改程序上

总之,一个方法必须声明可能抛出的受查异常,非受查异常要么是错误(Error),要么是可以避免发生的RuntimeException

注意:

  • 如果在子类中覆盖了一个父类的方法,子类声明的受查异常不可比父类的方法中声明的异常更为通用.
  • 如果父类方法没有抛出任何受查异常,那么子类也不能抛出任何受查异常

1.3抛出异常:

对于一个已知的异常类:

1).找到一个合适的异常类

2).创建这个类的对象

3).将对象抛出

String readData(Scanner in) throws EOFException
{. . .while (. . .){if (!in.hasNext()) {if (n < len)throw new EOFException();}. . .}return s;
}

一旦方法抛出了异常,该方法就不会返回给调用者,我们就不必再为返回的默认值或错误代码担忧  

1.4创建异常:

class FileFormatException extends IOException
{public FileFormatException() {}public FileFormatException(String gripe){super(gripe);}
}

习惯上,定义的类包含两个构造器,一个是无参构造器,另一个是带有详细描述的构造器(父类Throwable的toString方法将会打印出详细信息)  

自定义构造器代码例:

String readData(BufferedReader in) throws FileFormatException
{. . .while (. . .){if (ch == -1) {if (n < len) throw new FileFormatException();}. . .}return s;
}

1.5.1捕获异常:

try
{codemore codemore code
}
catch (ExceptionType e)
{handler for this type
}

如果在try语句块中抛出了在catch语句块中说明的异常类,那么:

  • 程序将跳过try语句块其余的代码
  • 执行catch子句中的处理代码(如果在try中没有抛出任何异常,跳过catch子句)

如果方法中任何代码抛出了在catch中没有声明的异常,那么这个方法会立即退出

代码演示说明:

public void read(String filename)
{try{    InputStream in = new FileInputStream(filename);int b;while ((b = in.read()) != -1){process input}}catch (IOException exception){exception.printStackTrace();}
}

read方法可能抛出一个IOException,这将会跳出while循环,进入catch子句,并声称一个栈轨迹(stack trace)

通常,最好的办法是什么也不做,而是将异常传给调用者,让调用者去操心怎么做,如果采用这种方式,就必须声明这个方法可能会抛出的异常:public void read(String filename) throws IOException

 

1.5.2捕获多异常:

try
{code that might throw exceptions
}
catch (FileNotFoundException e)
{emergency action for missing files
}
catch (UnknownHostException e)
{emergency action for unknown hosts
}
catch (IOException e)
{emergency action for all other I/O problems
}

在JKD1.7之后,可以这样捕获异常:

catch (FileNotFoundException | UnknownHostException e)
{emergency action for missing files and unknown hosts
}

注意:捕获多个异常时,异常的变量为final

捕获多个异常不仅会使代码看起来更简洁,而且会使代码运行效率更快

1.6finally语句:

不管是否有异常被捕获,finally子句都必将被执行:

InputStream in = new FileInputStream(. . .);
try
{// 1code that might throw exceptions// 2
}
catch (IOException e)
{// 3show error message// 4
}
finally
{// 5in.close();
}
// 6

1).代码没有抛出异常.执行:1.2.5.6

2).抛出一个可以在catch中捕获的异常:

  • 如果catch没有抛出异常,执行:1.3.4.5.6
  • 如果catch子句抛出一个异常,执行:1.3.5(异常被抛会给方法调用者)

3).代码抛出一个异常,但没有catch可以捕获到,执行:1.5

因此,finally子句是无论如何都会执行的,下面的例子有一种令人意外的结果:

public static int f(int n)
{try{int r = n * n;return r;}finally{if (n == 2) return 0;}
}

调用f(2),try子句return结果r = 4,但是finally必然执行,return 0并覆盖 r = 4.

转载于:https://www.cnblogs.com/nothingAJ/p/6677901.html

java异常处理(Exception handing)机制相关推荐

  1. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

  2. Java异常处理Exception——银行余额不足实例

    问题: 编写一个程序,完成在银行的取款和存款操作.在定义银行类时,若取款大于余额则作为异常处理 MyException.java package bank;public class MyExcepti ...

  3. java 异常处理向处机制笔记

    package eight;import java.io.*;/*** @author KuKaFei.Hai* @date 2020/4/14 : 16:50* @Email : 383232084 ...

  4. Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

    文章的标题看似自相矛盾,然而我在"正确"二字上打了引号.我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点. 看下面这段程序.方法pleas ...

  5. java提供两种处理异常的机制_浅析Java异常处理机制

    关于异常处理的文章已有相当的篇幅,本文简单总结了Java的异常处理机制,并结合代码分析了一些异常处理的最佳实践,对异常的性能开销进行了简单分析. 博客另一篇文章<[译]Java异常处理的最佳实践 ...

  6. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  7. Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  8. 深入理解java异常处理机制

    1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象 ...

  9. Java异常处理机制很有意思

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/43015379 前言:在网络上看到一篇<深入理解Java ...

  10. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

    多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作.运行不同代码(重写 ...

最新文章

  1. Single molecule real-time (SMRT) sequencing comes of age: applications and utilities for medical dia
  2. python多线程爬虫实例-python支持多线程的爬虫实例
  3. python变量进阶(可变不可变,局部变量和全局变量)
  4. linux命令总结之traceroute命令
  5. OpenGL通过Assimp加载模型
  6. 从上往下打印出二叉树的每个节点,同层节点从左至右打印
  7. 由一个问题引发的思考
  8. SAP Spartacus Organization Unit User页面的实现层级结构
  9. 如果走单招学计算机好考吗,单招一般多少分过 走单招好不好
  10. selenium的定位方式
  11. webpack多页面开发与懒加载hash解决方案
  12. visual studio 2019配置dlib读取jpeg图片
  13. [来自软件No1]XP Skin Pack系统主题-把windows 7变回xp的模样
  14. 【Spark】Spark安装详解
  15. python怎么选取第几行第几列_python 第几行第几列python 常见的17个错误分析-python-第二电脑网...
  16. 微信小程序 新版canvas绘制图片方法
  17. SQL SERVER 链接服务器Mysql
  18. 英雄远征Erlang源码分析(8)-怪物相关
  19. RUST 环境 UDP UART CANFD
  20. 施努卡:锂电池负极材料生产线(电池正极材料生产工艺)

热门文章

  1. EDG获得S11冠军
  2. 【论文阅读笔记】GPT三部曲
  3. rails erb_您需要知道Rails中的erb以及如何掌握它
  4. 51单片机、STM32中生成QRCode二维码
  5. 如何评价 IEEE Access 成为了 Top 期刊?
  6. 实习收获之 获取json对象键值的几种方法
  7. 数论基本定理和欧拉广义降幂公式
  8. qt 子线程(多线程)更新gui的几种方法
  9. 【Leetcode】| Largest Number
  10. 阿里笔试--智能对话简化版之query指令槽位识别