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

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

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

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

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

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. linux path环境变量基础

    系统环境变量与个人环境变量的配置文件 系统级别的配置文件:  /etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HO ...

  2. NVIDIA/DIGITS:Building DIGITS

    在 Prerequisites中的 sudo apt-get update命令发生错误: W: GPG 错误:http://developer.download.nvidia.com/compute/ ...

  3. 训练caffe:registry.count(type) == 0 (1 vs. 0) Solver type Nesterov already registered

    命令:./continue-train.sh 内容:../../caffe-master/build/tools/caffe train -gpu=$1 -solver=solver.prototxt ...

  4. Ipython\Jupyter数据分析工具

    使用Python进行数据分析优点 1 Python大量的库为数据分析和处理提供了完整的工具集 2 比起R和Matlab等其他主要用于数据分析的编程语言,Python更全能 3 Python库一直在增加 ...

  5. springmvc和struts2的区别(转)

    1.客户端浏览器发出HTTP请求.   2.根据web.xml配置,该请求被FilterDispatcher接收.   3.根据struts.xml配置,找到需要调用的Action类和方法, 并通过I ...

  6. Redis、Mongodb、memcache区别在哪里?

    最近在看一本书<php mvc开发实战>看到Redis实战部分,详细介绍了几种缓存的区别和对比,帮助解决这方面的疑惑 Redis适合哪些业务场景?

  7. Spring2集成iBatis2

    从数据库中查询一条记录,演示Spring与iBatis的集成 1 编写sqlmaps与Domain对象 <?xml version="1.0" encoding=" ...

  8. [bzoj] 3343 教主的魔法 || 带修改分块

    原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...

  9. 花花的礼物 (huahua)

    花花的礼物 (huahua) 花花是个爱动脑子的孩子,在她的生日的时候,她的爸爸给她准备了个礼物.但是,她的爸爸并不想让她轻易得到礼物,他把礼物放在了一个箱子里面,只有输入正确的密码才能打开箱子,而她 ...

  10. Java面试题之CyclicBarrier和CountDownLatch的区别

    1.CyclicBarrier的某个线程运行到某个点后停止运行,直到所有线程都达到同一个点,所有线程才会重新运行: CountDownLatch线程运行到某个点后,计数值-1,该线程继续运行,直到计数 ...