异常(Exception)的概念

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。

Java是采用面向对象的方式来处理异常的。处理过程:

1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。

2.  捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

异常分类

JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。

 Error:Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

Exception: Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。

通常Java的异常可分为:

1. RuntimeException 运行时异常

2. CheckedException 已检查异常

RuntimeException运行时异常:  派生于RuntimeException的异常,如被 0 除、数组下标越界、空指针等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。 因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。这类异常通常是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,经常需要通过增加“逻辑处理来避免这些异常”。

NumberFormatException异常

package cn.dym09;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test03 {public static void main(String[] args) {String str="45645wefrewgf";Pattern p=Pattern.compile("^\\d+$");Matcher m=p.matcher(str);if(m.matches()) {//如果str匹配代表数字的正则表达式,才会转换System.out.println(Integer.parseInt(str));}}
}

CheckedException:IOException、SQLException等以及用户自定义的Exception异常。 这类异常在编译时就必须做出处理,否则无法通过编译。

异常的处理方式有两种:使用“try/catch”捕获异常、使用“throws”声明异常。

捕获异常: 捕获异常是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行(catch语句可有多条;finally语句最多只能有一条,根据自己的需要可有可无)。

注: 一个try语句必须带有至少一个catch语句块或一个finally语句块 。

catch: u-toString ()方法,显示异常的类名和产生异常的原因

u-getMessage()方法,只显示产生异常的原因,但不显示类名。

u-printStackTrace()方法,用来跟踪异常事件发生时堆栈的内容。

catch捕获异常时的捕获顺序:如果异常类之间有继承关系,在顺序安排上需注意。越是顶层的类,越放在下面,再不然就直接把多余的catch省略掉。 也就是先捕获子类异常再捕获父类异常。

       finally:finally中关闭程序块已打开的资源,比如:关闭文件流、释放数据库连接等。

注:1. 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

2. finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。

package cn.dym09;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test05 {public static void main(String[] args) {FileReader reader=null;try {reader =new FileReader("d://a.txt");char c=(char) reader.read();char c2=(char)reader.read();}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e) {e.printStackTrace();}finally {try {if(reader!=null) {reader.close();}}catch(Exception e){e.printStackTrace();}}}
}

throws: 当CheckedException产生时,不一定立刻处理它,可以再把异常throws出去。在方法中使用try-catch-finally是由这个方法来处理异常。但是在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

package cn.dym09;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test06 {public static void main(String[] args) {try {readFile("joke.txt");}catch(FileNotFoundException e) {System.out.println("所需文件不存在!");}catch(IOException e) {System.out.println("文件读写错误!");}}public static void readFile(String fileName) throws FileNotFoundException,IOException{FileReader in=new FileReader(fileName);int tem=0;try {tem=in.read();while(tem!=-1) {System.out.print((char)tem);tem=in.read();}}finally {in.close();}}
}

注: 1. 方法重写中声明异常原则:子类重写父类方法时,如果父类方法有声明异常,那么子类声明的异常范围不能超过父类声明的范围。

自定义异常:自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

package cn.dym09;class IllegalAgeException extends Exception{//默认构造器public IllegalAgeException() {super();   }//带有详细信息的构造器,信息存储在message中public IllegalAgeException(String message) {super(message);       }
}class Person{private String name;private int age;public void setName(String name) {this.name=name;}public void setAge(int age) throws IllegalAgeException{if(age<0) {throw new IllegalAgeException("人的年龄不应该为负数");}this.age=age;}public String toString() {return "name is "+name+" and age is "+age;}
}public class Test07 {public static void main(String[] args) {Person p=new Person();try {p.setName("代止兮");p.setAge(-9);}catch(IllegalAgeException e) {e.printStackTrace();System.exit(-1);}System.out.println(p);}
}

使用异常机制的建议:1.要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。

2.处理异常不可以代替简单测试---只在异常情况下使用异常机制。

3.不要进行小粒度的异常处理---应该将整个任务包装在一个try语句块中。

4.异常往往在高层处理

Java的知识点19——异常机制Exception相关推荐

  1. Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)

    原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...

  2. Java基础篇:异常机制

    目录: 一.为什么使用异常: 二.异常体系: 三.异常的捕捉--try.catch.finally: 四.关于异常的题: 五.自定义异常: 六.异常链: 七.异常的使用误区: 八:throw.thro ...

  3. 解释java程序中的异常机制_Java编程中的异常机制

    本文旨在以初学者的角度来学习Java异常的知识,尽量简单,一些细枝末节的知识不会讲述,但不影响对知识的掌握. (比如try-catch可以嵌套,不太会这么用) 1.什么是异常 我们先举个例子 int ...

  4. java catch throwable_如何处理异常? catch Exception OR catch Throwable

    在Java中,当你需要统一处理异常的时候,你是会选择catch (Exception),还是直接catch (Throwable)? Java的异常体系 Throwable: Java中所有异常和错误 ...

  5. C++异常处理之abort()、异常机制、exception 类

    程序运行时有时会遇到错误,导致程序无法正常运行下去,通常程序员会试图预防这种意外.C++异常为处理这种情况提供了一种功能强大而灵活的工具.这里仅介绍三种: 调用abort()函数 异常机制 excep ...

  6. java 异常机制_深入理解Java异常处理机制

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

  7. Java面试知识点:Date类、异常

    问题:Java面试知识点:Date类.异常 答案: 1.Date类 代码如下: (1)创建日期: package com.xy;import java.util.Date;/*** @ProjectN ...

  8. 聊聊Java的异常机制问题

    本文分享自华为云社区<Java知识点问题精选之异常机制>,原文作者:breakDraw . java异常指在程序运行时可能出现的一些错误,如:文件找不到.网络连接失败.非法参数等.异常是一 ...

  9. java深入浅出解析异常机制

    java中的异常处理的目的在于通过使用少量的代码,使得程序有着强大的鲁棒性,并且这种异常处理机制会让你变得非常自信:你的应用中没有你没处理过的错误.处理异常的相关手法看起来是这么的难懂,但是如果掌握的 ...

最新文章

  1. 机器学习评价指标ROC AUC
  2. python3语法、菜鸟教程_Python3
  3. asp.net MVC的EF与easyui DataGrid数据绑定
  4. 实时监控Cat之旅~对Get和Post进行封装,支持分布式消息树
  5. 表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决
  6. 清华大学医学院 | 体外成熟人卵单细胞多组学研究及总结干细胞分化为配子进展文章...
  7. 每日一道python的leetcode:冒泡排序
  8. 历届二级c语言pdf,历年全国计算机二级C语言题库.pdf
  9. 1.5 万字 + 40 张图解 HTTP 常见面试题(值得收藏)
  10. 叉乘应用:判断三角形方向正反/三个点顺时针逆时针
  11. 条码标签软件中如何在二维码输入汉字
  12. 高德3D动态地图—旋转视角
  13. 一、计算机基础: 特点、数制、编码、组成
  14. Java开发专家阿里P6-P7面试题大全及答案汇总(持续更新)
  15. java edt,Java Swing 学问篇 - EDT
  16. Piezo Mac 优秀的录音软件
  17. useradd 无法打开密码文件
  18. 手机端问题IOS及解决办法
  19. dw6能编译asp吗_dreamweaver运行asp文件的方法
  20. 点餐系统mysql设计,酒店点餐系统的设计与实现(JSP,HTML5,MySQL)(含录像)

热门文章

  1. 在Docker中体验数据库之MySql
  2. window环境apache服务器在本地添加域名
  3. 《深入理解JAVA虚拟机》——学习笔记
  4. [Eclipse的Maven项目搭建,仅为测试Maven功能]如何在Eclipse下搭建Maven项目
  5. iOS之runtime
  6. FineUI第七天---文件上传
  7. android+Unity3D游戏开发之简单的物体运动
  8. Excel exportExcel.cs 一个生成.xls文件的例子
  9. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解
  10. IBM发表论文:可能已找到处理量子计算退相干的方法