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

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

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

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

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

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. django之HTTPResponse和JsonResponse详解

    HttpResponse对象 Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数.那么视图函数在处理完相关的逻辑后,也需要返回一个响 ...

  2. Java 中xml解析

    1.String 字符串保持到txt文件 String xml ="abcdefghijk"; FileWriter fw = null; File f = new File(&q ...

  3. 防御暴力破解SSH攻击

    托管在IDC的机器我们通常都用SSH方式来远程管理.但是经常可以发现log-watch的日志中有大量试探登录的 信息,为了我们的主机安全,有必要想个方法来阻挡这些可恨的"HACKER&quo ...

  4. Java进行身份证格式强校验(准)

    最近做了一个系统,涉及到对用户输入的身份证号进行校验,减少脏数据传入后台处理并降低企业验证成本,因此在接入层便对输入信息做格式强校验. 直接附上代码,可直接使用. package hope.ident ...

  5. [blockchain-035]eos的部署安装智能合约

    0.参考资料 https://github.com/EOSIO/eos/wiki 1. eos的github地址 https://github.com/EOSIO/eos 2.下载eos源码 git ...

  6. BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】

    题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...

  7. BZOJ2879 [Noi2012]美食节 【费用流】

    题目 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...

  8. Web实现数据库链接的登录注册修改密码功能

    /** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...

  9. 《c程序设计语言》-2.9

    #include <stdio.h> /*int bitcount(unsigned x) { int b; for(b = 0;x != 0;x >>= 1) { if(x ...

  10. mysql 导入

    1.默认情况下:MySQL导入文件大小有限制的,最大为2M,所以当文件很大时候,直接无法导入,可修改php.ini参数调整: 在php.ini中修改相关参数: 影响MySQL导入文件大小的参数有三个: ...