异常的感性认识

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

divide.c

  1. #include <stdio.h>
  2.  
  3. int main() {
  4. == divide(, )) {
  5. printf("除数不能为0.\n");
  6. }
  7. }
  8.  
  9. int divide(int divident, int divisor) {
  10. //如果除数为0,则返回-1
  11. == divisor) {
  12. ;
  13. }
  14.  
  15. //如果除法不为0,则返回0
  16. printf("%d\n", divident/divisor);
  17. ;
  18. }

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

Divide.java

  1. public class Divide {
  2. public static void main(String[] args) {
  3. //把有可能产生异常的句子放在try{}语句中
  4. try {
  5. divide(1, 0);
  6. }
  7. //通过catch(){}语句对异常进行处理. 注意:可以有多个catch(){}语句,因为有多个异常嘛
  8. catch(Exception e) {
  9. e.printStackTrace();
  10. }
  11. //finally{}里面的程序块,无论有没有异常,都会执行,多用于关闭资源.(..粗俗的说,也可以说是插屁股的")
  12. //注: finally{}可以省略,但try{} catch(){}不行!
  13. finally {
  14. System.out.println("白白");
  15. }
  16.  
  17. System.out.println("注意:对异常处理之后,后面的句子仍旧执行.");
  18. }
  19.  
  20. public static int divide(int i, int j) {
  21. int result = i / j;
  22. return result;
  23. }
  24. }

异常的类型

如上图:(来源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

  1. /* Exception in thread "main" java.lang.Exception: w的值不能为负数!
  2. * at Cup.test(Demo.java:32)
  3. * at Cup.addWater(Demo.java:16)
  4. * at Demo.main(Demo.java:4)
  5. */
  6. public class Demo {
  7. public static void main(String[] args) throws Exception {
  8. Cup cup = new Cup();
  9. cup.addWater(-1.0);
  10. }
  11. }
  12.  
  13. class Cup {
  14. private double water = 0.0;
  15. private double maxWater = 100.0; //杯子的最大容量为100.0ml
  16.  
  17. public void addWater(double w) throws Exception {
  18. test(w);
  19. //如果要加的水+本来拥有的水的体积小雨水杯的最大容量,那么就 "this.water = w + this.water"
  20. //否则,水溢出,直接设置 water = 最大容量 100ml即可
  21. if (w + this.water < maxWater) {
  22. this.water = w + this.water;
  23. } else {
  24. this.water = 100.0;
  25. }
  26. }
  27.  
  28. //检查w的值是否正确,也就是检查w是不是整数
  29. public void test(double w) throws Exception {
  30. if (w < 0) {
  31. Exception e = new Exception("w的值不能为负数!");
  32. throw e;
  33. } 总结:抛出异常对象(throw), 不对异常进行处理,将异常交给上层处理(throws),自己处理异常(try catch)
  34. }
  35. }

自定义异常

DIYException.java

  1. public class DIYExcetpion extends Exception {
  2. public DIYException(){}
  3.  
  4. //在自定义异常的时候,要选择更具体的类,这样会包含更多的异常信息
  5. public DIYException(String message) {
  6. super(message);
  7. }
  8. }

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. C#设计模式原则

    原则的诞生:面向对象:封装.继承.多态三大支柱蕴含了用抽象来封装变化,降低耦合,实现复用的精髓: 封装:隐藏内部的实现,保护内部信息: 继承:实现复用,归纳共性: 多态:改写对象行为,实现更高级别的继 ...

  2. SunmmerVocation_Learning--Java数组的创建

    一维数组声明方式: type var[] 或 type[] var; 如int a[], int[] a; Java中声明数组不能指定其长度,如int a[5]是非法的. 一维数组对象的创建: Jav ...

  3. springboot中加入druid对sql进行监控

    springboot作为现在十分流行的框架,简化Spring应用的初始搭建以及开发过程,现在我们就使用springboot来进行简单的web项目搭建并对项目sql进行监控. 项目的搭建就省略了,spr ...

  4. 【Ecshop】修改处理用户购物车的行为

    Ecshop v2.7.3的购物车处理方面在现在看来有比较反用户体验的设计: 用户未登录时加入购物车的商品,在用户登录后会被清空而不是加入到登录用户的购物车中: 用户登录后加入购物车的商品,在退出后会 ...

  5. 离线安装 Visual Studio Express 而不下载整个镜像文件的方法(转载)

    转 visual studio 2010 express 全序列号 phone开发工具YDK44-2WW9W-QV7PM-8P8G8-FTYDF VC# 2010 Express: PQT8W-68Y ...

  6. K-th Number POJ - 2104

    K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...

  7. 记忆化搜索:POJ1088-滑雪(经典的记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...

  8. [Hdu3555] Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

  9. mysql基础查询

    #进阶1:基础查询/*语法:select:查询列表 from 表名; 类似于:System.out.println(打印的东西); 特点:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的 ...

  10. 在 Amazon AWS 搭建及部署网站:(二)安装、配置软件,启动网站

    现在,我们已经有了一台EC2主机,具备了基本的硬件环境.下面,开始软件环境的配置. 第一步:连接服务器 后面所有的一切,都需要在SSH终端窗口操作.首先,我们需要一个SSH客户端.PuTTY是很常用的 ...