异常的感性认识

在没有异常机制的语言中,经常通过返回值来表示调用该函数产生的各种问题(异常),比如c语言.

divide.c

#include <stdio.h>

int main() {
     == divide(, )) {
        printf("除数不能为0.\n");
    }
}

int divide(int divident, int divisor) {
    //如果除数为0,则返回-1
     == divisor) {
        ;
    }   

    //如果除法不为0,则返回0
    printf("%d\n", divident/divisor);
    ;
}

在java中,通过它的异常处理机制,可以对异常进行处理.

Divide.java

public class Divide {
    public static void main(String[] args) {
        //把有可能产生异常的句子放在try{}语句中
        try {
            divide(1, 0);
        }
        //通过catch(){}语句对异常进行处理. 注意:可以有多个catch(){}语句,因为有多个异常嘛
        catch(Exception e) {
            e.printStackTrace();
        }
        //finally{}里面的程序块,无论有没有异常,都会执行,多用于关闭资源.(..粗俗的说,也可以说是插屁股的")
        //注: finally{}可以省略,但try{} catch(){}不行!
        finally {
            System.out.println("白白");
        }

        System.out.println("注意:对异常处理之后,后面的句子仍旧执行.");
    }

    public static int divide(int i, int j) {
        int result = i / j;
        return result;
    }
}

异常的类型

如上图:(来源http://www.cnblogs.com/vamei/archive/2013/04/09/3000894.html)

橙色的表示不可以处理的异常, 蓝色的表示可以处理的异常.

其中,

Error(以及其衍生类)是系统错误(比如 内存不足, java内部错误等等), 这个我们程序员是无法处理的.

Exception下的衍生类 "RuntimeException", 这个是java程序本身有问题,也就是"bug"造成的. 比如"NullPointerException", "IndexOutOfBoundsException",  "ClassCastException"等等. 如果出现这些异常, 首先不是"try   catch", 而是检查自己代码是否出问题了

继承了Exception又不是RuntimeException的子类,也就是上图蓝色部门的异常,我们就需要处理了.这些异常往往是在与用户交互的时候产生的,比如用户想要读取一个不存在的文件, 这个时候,就会出现"FileNotFoundException"异常. 这个我们就必须处理了

总结:抛出异常对象(throw), 不对异常进行处理,将异常交给上层处理(throws),自己处理异常(try catch)

Demo.java

/* Exception in thread "main" java.lang.Exception: w的值不能为负数!
 *  at Cup.test(Demo.java:32)
 *      at Cup.addWater(Demo.java:16)
 *          at Demo.main(Demo.java:4)
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        Cup cup = new Cup();
        cup.addWater(-1.0);
    }
}

class Cup {
    private double water = 0.0;
    private double maxWater = 100.0;        //杯子的最大容量为100.0ml

    public void addWater(double w) throws Exception {
        test(w);
        //如果要加的水+本来拥有的水的体积小雨水杯的最大容量,那么就 "this.water = w + this.water"
        //否则,水溢出,直接设置 water = 最大容量 100ml即可
        if (w + this.water < maxWater) {
            this.water = w + this.water;
        } else {
            this.water = 100.0;
        }
    }   

    //检查w的值是否正确,也就是检查w是不是整数
    public void test(double w) throws Exception {
        if (w < 0) {
            Exception e = new Exception("w的值不能为负数!");
            throw e;
        }   总结:抛出异常对象(throw), 不对异常进行处理,将异常交给上层处理(throws),自己处理异常(try catch)
    }
}

自定义异常

DIYException.java

public class DIYExcetpion extends Exception {
    public DIYException(){}

    //在自定义异常的时候,要选择更具体的类,这样会包含更多的异常信息
    public DIYException(String message) {
        super(message);
    }
}

Java简明教程 11.异常的更多相关文章

  1. Java 简明教程

    本文为 Java 的快速简明教程,主要用于快速了解.学习和复习java的语法特点. // 单行注释 /* 多行注释 */ /** JavaDoc(Java文档)注释是这样的.可以用来描述类和类的属性. ...

  2. Python 简明教程 --- 11,Python 元组

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 软件工程的目标是控制复杂度,而不是增加复杂性. -- Dr. Pamela Zave 目录 我们在上 ...

  3. duilib教程之duilib入门简明教程11.部分bug

    一.WindowImplBase的bug    在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,    1.最大化按钮的样式还是没 ...

  4. Java简明教程

    Java与C++比较概况 C++ Java class Foo { // 声明 Foo 类 public: int x; // 成员变量 Foo(): x() { // Foo 的构造函数Constr ...

  5. Java基础教程(22)--异常

    一.什么是异常   异常就是发生在程序的执行期间,破坏程序指令的正常流程的事件.当方法中出现错误时,该方法会创建一个对象并将其交给运行时系统.该对象称为异常对象,它包含有关错误的信息,包括错误的类型和 ...

  6. Java基础教程(11)--对象

    一.创建对象   下面的语句创建了一个对象并把它的引用赋值给了一个变量: Point originOne = new Point(23, 94);   这条语句由三部分组成(下面将详细讨论): 声明对 ...

  7. Java简明教程 12.多线程(multithreading)

    单线程和多线程 关于它们的区别,zhihu上有一个回答,我认为十分不错,如下: . 单进程单线程:一个人在一个桌子上吃菜. . 单进程多线程:多个人在同一个桌子上一起吃菜. . 多进程单线程:多个人每 ...

  8. Python 简明教程 --- 15,Python 函数

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 测试只能证明程序有错误,而不能证明程序没有错误. -- Edsger Dijkstra 目录 本节我 ...

  9. Python 简明教程 --- 14,Python 数据结构进阶

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果你发现特殊情况太多,那很可能是用错算法了. -- Carig Zerouni 目录 前几节我们介 ...

随机推荐

  1. Linux MySQL 修改密码

    修改root本地登录密码 修改root默认的密码(方法一)1. 启动mysql之后systemctl start mysqld.service2. 修改mysql的配置文件 vi /etc/my.cn ...

  2. 织梦dedecms出现系统基本参数空白或显示Call to undefined function make_hash()

    织梦dedecms出现系统基本参数空白或显示Call to undefined function make_hash() 最新的织梦版本(2018-01-09)修改了include文件夹中的commo ...

  3. c++question 004 c++基本数据类型有哪些?

    (1)signed int类型 整数型 占内存4个字节 一个字节byte 占8个二进制位 一个整型就占32位 (2)short int  短整型 占内存2个字节 一个短整型占16位 (3)long i ...

  4. Sass和gulp的简单了解

        一.sass  less    css预处理器        sass里面有2种语法  第一种语法是sass  后缀名必须是sass   第二种语法是scss  后缀名必须是scss      ...

  5. SummerVocation_Learning--java的String类运用

    题目: 编写一个程序,输出一个字符串中的大写字母数,小写字母数,及其它字母数. 思路1: 可以先遍历整个字符串,在判断每个字符的类型. public class TestString { public ...

  6. 2018.11.7 Nescafe29 T1 穿越七色虹

    题目 题目背景 在 Nescafe27 和 28 中,讲述了一支探险队前往 Nescafe 之塔探险的故事…… 当两位探险队员以最快的时间把礼物放到每个木箱里之后,精灵们变身为一缕缕金带似的光,簇簇光 ...

  7. django+xadmin在线教育平台(三)

    通过留言版功能回顾django基础知识 将对于django目录结构,使用Django快速搭建可以提交的表单页面,models.py , urls.py, views.py. 从数据库中取出数据展示到h ...

  8. yum安装报错

    检查了好久才知道原来是 sudo nano /etc/sysconfig/network-scripts/ifcfg-ens33 下的DNS配错了,改好之后,sudo service network ...

  9. python从入门到精通之30天快速学python视频教程

    点击了解更多Python课程>>> python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv pyth ...

  10. 删除Zend Studio项目

    导入了过大的项目,导致很卡,且Close Project和Delete操作不了,一直无响应. 调整项目目录下的隐藏文件夹,删除对应项目: E:\www\.metadata\.plugins\org.e ...