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

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

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

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

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

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. Java UDP的简单实例以及知识点简述

    UDP的实现 Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类. 其与TCP协议实现不同的是: UDP的套接字DatagramSoc ...

  2. YouTube高效传输策略:节省14%带宽 用户体验提升

    视频平台会侦测用户端的带宽来调整码率及分辨率,但通常只考虑到编码器的比特率率--质量关联,忽略了用户的可用带宽影响.YouTube团队通过让视频流匹配用户带宽,不仅节省了带宽,还有效提升了用户主观体验 ...

  3. 商店购物 (shopping.c/cpp/pas)

    1.商店购物 (shopping.c/cpp/pas) 在滨海市开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上 限,第 i 家商店的日消费量上限为 wi. 海霸王 ...

  4. spring in action 学习笔记十四:用纯注解的方式实现spring mvc

    在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...

  5. navicat for mysql 2003错误

    最近又一次碰到navicat for mysql 2003错误,之前碰到好几次了,问题再次出现还是有些不知所措,所以记下来,再次遇到时就可以迎韧有余了. 解决方案1: 重启防火墙:关闭再重新开启. 解 ...

  6. FastDfs java客户端上传、删除文件

    #配置文件 connect_timeout = 2 network_timeout = 30 charset = UTF-8 http.tracker_http_port = 9090 http.an ...

  7. 玩具谜题(NOIP2016)(纯模拟)

    原题传送门 神奇的题目.. 朝左朝右异或一下就好了 细节处理一下,输出now的字符串 下面贴代码 #include<iostream> #include<cstdio> #in ...

  8. QML与C++混合编程详解

    1.QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧. 2.QML访问 ...

  9. Linux Context , Interrupts 和 Context Switching 说明【转】

    转自:http://blog.csdn.net/tianlesoftware/article/details/6461207 一. 进程Context 定义 当一个进程在执行时, CPU的所有寄存器中 ...

  10. electron 安装使用

    1.安装 node.js 链接:http://pan.baidu.com/s/1o7W7BIy 密码:y6od 一路next 我安装在F:\Program Files\node.js下 2.检查nod ...