1.13(java学习笔记)异常机制
异常不同于错误,它是程序运行时产生的未知问题。
如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常。
那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它们搬走石头。
如果是汽车的发动机坏了,这叫错误。
即使程序本身没有问题,也会因为各种因素产生异常。
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都会执行
}
}
}
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学习笔记)异常机制的更多相关文章
- Java学习笔记--异常机制
简介 在实际的程序运行过程中,用户并不一定完全按照程序员的所写的逻辑去执行程序,例如写的某个模块,要求输入数字,而用户却在键盘上输入字符串:要求打开某个文件,但是文件不存在或者格式不对:或者程序运行时 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- Java学习笔记--异常描述
异常描述 1.简介 为了全面了解"异常"的概念,先来分析一个实例.假定要编写一个Java程序,该程序读取用户输入的一行文本,并在终端显示该文本.这里是一个演示Java语言I/O功能 ...
- Java学习 · 初识 异常机制
异常机制 1. 程序中的异常 a) b) 面对异常如何解决 i. 由开发者通过if-else来解决 代码臃肿 程序员需要花费很大精力 ii. ...
- JAVA 学习笔记 - 反射机制
1. JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...
- 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?
上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...
- java学习笔记 --- 异常
异常 (1)程序出现的不正常的情况. (2)异常的体系 Throwable |--Error 错误,严重问题,我们不处理. · |--Exception 异常 |--R ...
- Java学习笔记-反射机制
Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
随机推荐
- bitbucket相关操作
常见命令: git checkout -b develop master 创建Develop分支的命令 git checkout master 切换到Master分支 git merge --no-f ...
- 爬虫:Scrapy8 - Item Pipeline
当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,一些组件会按照一定的顺序执行对 Item 的处理. 每个 item pipeline 组件(有时也称之为“It ...
- fragment中的WebView返回上一页
public final class Text1Fm extends Fragment { static WebView mWeb; private View mContentView; privat ...
- Struts2+DAO层实现实例02——搭建DAO基本框架并与Struts2组合
实例内容 创建DAO(Data Access Oject)接口:BaseDAO 创建其实例化类:UserDAO 用于获取数据库struts中的userinfo表中的内容 创建User的Java Bea ...
- MPLAB® XC C编译器的Workstation License的获取及安装方法
MPLAB®XC C编译器的Workstation License获取及安装方法如下:首先需要购买获得一个XC C编译器的激活码,然后到以下网页(http://www.microchip.com/rl ...
- LeetCode -- Construct Binary Tree from Preorder and Inorder
Question: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may as ...
- 70种简单常用的JS代码
1.后退 前进 <input type="button" value="后退" onClick="history.go(-1)&quo ...
- for 循环里的i++
写代码的时间也不短了,今天看快速排序的算法的时候才去更深层次得理解... for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 (代码块)开始前执行 语句 2 定义运 ...
- JSP、JSTL、EF学习笔记
JSP 1)Java Server Page,在html中嵌入java代码 2)九个内置(隐式)对象 request response out page pageContext config sess ...
- glEnable(GL_DEPTH_TEST)的问题
http://www.gameres.com/msg_195903.html 在程序中加入glEnable(GL_DEPTH_TEST)之后显示就完全黑屏了,即使是清空了深度缓冲glClear(GL_ ...