Java简明教程 11.异常
异常的感性认识
在没有异常机制的语言中,经常通过返回值来表示调用该函数产生的各种问题(异常),比如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.异常的更多相关文章
- Java 简明教程
本文为 Java 的快速简明教程,主要用于快速了解.学习和复习java的语法特点. // 单行注释 /* 多行注释 */ /** JavaDoc(Java文档)注释是这样的.可以用来描述类和类的属性. ...
- Python 简明教程 --- 11,Python 元组
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 软件工程的目标是控制复杂度,而不是增加复杂性. -- Dr. Pamela Zave 目录 我们在上 ...
- duilib教程之duilib入门简明教程11.部分bug
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式还是没 ...
- Java简明教程
Java与C++比较概况 C++ Java class Foo { // 声明 Foo 类 public: int x; // 成员变量 Foo(): x() { // Foo 的构造函数Constr ...
- Java基础教程(22)--异常
一.什么是异常 异常就是发生在程序的执行期间,破坏程序指令的正常流程的事件.当方法中出现错误时,该方法会创建一个对象并将其交给运行时系统.该对象称为异常对象,它包含有关错误的信息,包括错误的类型和 ...
- Java基础教程(11)--对象
一.创建对象 下面的语句创建了一个对象并把它的引用赋值给了一个变量: Point originOne = new Point(23, 94); 这条语句由三部分组成(下面将详细讨论): 声明对 ...
- Java简明教程 12.多线程(multithreading)
单线程和多线程 关于它们的区别,zhihu上有一个回答,我认为十分不错,如下: . 单进程单线程:一个人在一个桌子上吃菜. . 单进程多线程:多个人在同一个桌子上一起吃菜. . 多进程单线程:多个人每 ...
- Python 简明教程 --- 15,Python 函数
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 测试只能证明程序有错误,而不能证明程序没有错误. -- Edsger Dijkstra 目录 本节我 ...
- Python 简明教程 --- 14,Python 数据结构进阶
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果你发现特殊情况太多,那很可能是用错算法了. -- Carig Zerouni 目录 前几节我们介 ...
随机推荐
- vs2015“当前不会命中断点 还没有为该文档加载任何符号”的解决方法
解决方法:工具-选项-调试 -(启用“仅我的代码”)勾去掉
- edge不能上网-代码 INET_E_RESOURCE_NOT_FOUND
这个问题 ,网上有很多解决方法,我基本都测试了一遍,可是我都没有用 情况:首先,我开始的时候是可以用的,然后在公司,开了代理,就不能使用了,这是我之后多次尝试发现的,所以你也遇到和我一样的情况不必惊慌 ...
- PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)
http://www.patest.cn/contests/pat-b-practise/1003 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入 ...
- 对于新能源Can数据、电池BMS等字节和比特位的解析
1.对于1个字节(8个bit)以上的数据需要先进行倒序(因为高位在前 低位在后). CanID CanData 排序后的 字节数据 十进制 分辨率(0.005) 偏移量(40) 0x18FEC117 ...
- CentOS 7+ 环境下安装MySQL
在CentOS中默认安装有MariaDB,但是我们需要的是MySQL,安装MySQL可以覆盖MariaDB MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 ...
- zabbix 密码忘记了如何恢复
1.进入数据库 2.使用zabbix的数据库 use zabbix: 3.查看表信息 show tables; 4.搜索users表 select * from users; 5.修改userid为1 ...
- Class:向传统类模式转变的构造函数
前言 JS基于原型的'类',一直被转行前端的码僚们大呼惊奇,但接近传统模式使用class关键字定义的出现,却使得一些前端同行深感遗憾而纷纷留言:"还我独特的JS"."净搞 ...
- Vue钩子函数生命周期实例详解
vue生命周期简介 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁 ...
- MongDB之各种查询操作
接口IMongDaoFind: package com.net.test.mongdb.dao; public interface IMongDaoFind { public void findUse ...
- manjaro中文输入法已安装但切换不了解决方法
情况如图所示,输入法安装了,但Ctrl+空格键或者鼠标选择切换都不行 解决方法: 打开家目录下面的.xprofile文件,如果没有这个文件就新建一个,加入下面内容 保存文件,退出. 重启电脑就可以了