异常不同于错误,它是程序运行时产生的未知问题。

如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常。

那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它们搬走石头。

如果是汽车的发动机坏了,这叫错误。

即使程序本身没有问题,也会因为各种因素产生异常。

java秉承面向对象的思想,将异常也以类和对象的形式存在。

一、异常类的结构

异常和错误都继承于Throwable,

在Exception和Error下面还有许多具体的子类,这个可以自行查阅文档。

这样将异常类划分详细,便于出现对应异常时,便于编写对应的异常处理语句。

Exception主要是异常类,Error中是错误类。

像下面用到的try {}catch(这里面的类型主要是Exception 类下的子类){}

异常类中也有很多方法,大家可以自行查阅文档。

这里说一个printStackTrace()方法,作用是打印异常的详细信息。

二、在程序中使用异常处理

try{
//可能出现异常的语句
}catch(异常类 异常对象){
//编写异常处理语句
}catch(异常类 异常对象){
//编写异常处理语句
}catch(异常类 异常对象){
//编写异常处理语句
}catch(异常类 异常对象){
//编写异常处理语句
}finally{
//一定会运行到的语句
}

出现异常时:

(1)首先系统会实例化一个异常类的对象,

(2)然后try中自动捕获异常对象

(3)然后跳转到catch语句,逐个匹配最合适的异常类,执行该异常类下的异常处理语句

(4)最后跳转到finally,执行其中的语句。

没有异常时:try中语句执行完后,直接跳转到finally,执行其中的语句。

注:1.一个try{}中只能捕获一个异常。

2.try中当一个语句出现异常后就会跳转到catch,try中该语句之后的语句不会执行。

public class TestException {
public static void main(String[] args) {
int i = 1, j = 0;
try{
int temp = i / j; //此行有问题,j为0,所以在此之后的System.out.println(temp);不会被执行。
System.out.println(temp);
}catch(ArithmeticException e){
e.printStackTrace();
}finally{
System.out.println("finally"); //无论异常与否,finally都会执行
}
}
}
 
运行结果:
java.lang.ArithmeticException: / by zero
finally
 at cn.ch.testException.TestException.main(TestException.java:

3.catch中的异常类顺序要从小到大。

例如有如下继承结构:

写异常处理时可以这样写

public class TestException {
public static void main(String[] args) {
int i = 1, j = 0;
try{
int temp = i / j;
System.out.println(temp);
}catch(ArithmeticException e){
e.printStackTrace(); //先小类,后大类。
System.out.println("我是Arithmetic异常类,和抛出的异常对象最匹配") //因为捕获到异常后是逐次匹配,把大类(例如Exception)写在前面的话
}catch(RuntimeException e){ //所有异常都是这个大类,后面的异常都是无用的,而且不精确。
e.printStackTrace();
//异常处理语句
}catch(Exception e){
e.printStackTrace();
//异常处理语句
}
finally{
System.out.println("finally");
}
}
}
运行结果:
java.lang.ArithmeticException: / by zero
at cn.ch.testException.TestException.main(TestException.java:11)
我是Arithmetic异常类,和抛出的异常对象最匹配
finally

三、throws和throw

1.在定义一个方法时,可以使用throws声明,后面加上可能出现的异常类型。

那么这些异常不在该方法中处理,而是交给调用者去处理。

public class TestException {
static int add(int x, int y) throws Exception{//此处用throws声明,异常交给调用
return x + y; //的地方去处理。
}
public static void main(String[] args) {
int a1 = 2;
int a2 = 3;
try {
System.out.println(add(a1, a2));//此处调用了,就必须要处理。
} catch (Exception e) {
e.printStackTrace();
}
}
}

2.throw

利用throw可以人为抛出一个异常,然后try语句进行捕获抛出,然后catch进行匹配。

可知,throw就是将系统自动创建异常对象改为了自己创建异常对象。后面仍然是指catch中

匹配合适的异常类,指向改类中的语句,最后跳转到finally。

唯一的不同就是将系统自动创建改为了人为创建异常对象。

public class TestException {
public static void main(String[] args) { try {
throw new Exception("自己抛出的异常");
} catch (ArithmeticException e) {
//e.printStackTrace();
System.out.println("我是ArithmeticException类异常,和手动抛出的异常类型不匹配");
}catch(Exception e){
e.printStackTrace();
System.out.println("我是Excep类的异常,和手动抛出的异常类型匹配。");
}
}
}
运行结果:
java.lang.Exception: 自己抛出的异常
我是Excep类的异常,和手段动出的异常类型匹配。
at cn.ch.testException.TestException.main(TestException.java:

1.13(java学习笔记)异常机制的更多相关文章

  1. Java学习笔记--异常机制

    简介 在实际的程序运行过程中,用户并不一定完全按照程序员的所写的逻辑去执行程序,例如写的某个模块,要求输入数字,而用户却在键盘上输入字符串:要求打开某个文件,但是文件不存在或者格式不对:或者程序运行时 ...

  2. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  3. Java学习笔记--异常描述

    异常描述 1.简介 为了全面了解"异常"的概念,先来分析一个实例.假定要编写一个Java程序,该程序读取用户输入的一行文本,并在终端显示该文本.这里是一个演示Java语言I/O功能 ...

  4. Java学习 · 初识 异常机制

    异常机制 1.   程序中的异常 a)     b)    面对异常如何解决 i.           由开发者通过if-else来解决 代码臃肿 程序员需要花费很大精力 ii.           ...

  5. JAVA 学习笔记 - 反射机制

    1.   JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...

  6. 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?

    上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...

  7. java学习笔记 --- 异常

    异常 (1)程序出现的不正常的情况. (2)异常的体系   Throwable    |--Error  错误,严重问题,我们不处理.    ·    |--Exception 异常     |--R ...

  8. Java学习笔记-反射机制

    Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...

  9. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  10. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

随机推荐

  1. AppCan试用体验

    最近自己想开发一个基于Android平台的小应用,但不想使用JAVA开发,还要快速实现功能,学习成本低. 所以找了很多框架,最后基本锁定在phoneGap和AppCan,又看了AppCan与phone ...

  2. Python的HttpClient实现

    Python版本3.4(注意python的版本,python2和python3的写法不一样) 其实无非就是客户端的请求,所以python中这里使用的是urllib.request模块.主要注意的是he ...

  3. DevExpress的GridControl控件设置自定义显示方法

    比如要显示性别为字符串,数据库中保存为数值(1:男,2:女,3:未知). 方法一: 点击控件上的"Run Designer"按钮,进入设计界面. 选择“Columns", ...

  4. FileZilla修改文件大小格式

    之前使用FileZilla觉得很奇怪,文件大小显示为字节格式,很不习惯. 最近发现是在这里修改. 菜单“编辑”下选择设置,选择选项“文件大小格式”,在右边选择为:“使用SI式二进制前缀.(如 1 KB ...

  5. [codeforces] 585D Lizard Era: Beginning || 双向dfs

    原题 有n(n<=2)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使n个任务结束后三个人得到的值是一样的.输出每次要派哪两个人,如果不行输出Impossible. n< ...

  6. APIO2017游记

    铁牌选手爆零滚粗记QAQ........ CCF说不让讨论APIO相关内容不过现在应该没事了吧QAQ day0:上午还在学校填清北夏令营的表,下午上火车去北京,晚上颓颓颓...... day1:上午网 ...

  7. Tomcat学习笔记(三)

    Tomcat连接器 tomcat连接器是tomcat的一个核心组件,在tomcat4中的实现原理如下 1.实现Connector接口 2.创建Request对象 3.创建Response对象 tomc ...

  8. 一元多项式的表示及相加(抽象数据类型Polynomial的实现)

    // c2-6.h 抽象数据类型Polynomial的实现(见图2.45) typedef struct // 项的表示,多项式的项作为LinkList的数据元素 { float coef; // 系 ...

  9. WPF+MVVM数据绑定问题集锦

    1.  数据绑定的问题 在使用数据绑定时,一般使用 ObservableCollection<T> 类,不使用list列表集合,因为list数据发生变化时,UI界面不更新,而Observa ...

  10. 关于boostrapValidator动态添加字段(addField)验证的bug

    每次码博客,都觉得自己怀才不遇,哎~脑袋有瑕疵,文笔拿不粗手,就直接上干货吧. 在使用boostrapValidator这个验证插件的时候,如果某一个字段是动态添加来的,我们需要调用方法:addFie ...