重新开始学习javase_Exception
“违例”(Exception)这个词表达的是一种“例外”情况,亦即正常情况之外的一种“异常”。在问题发生的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去。此时,必须坚决地停下来,并由某人、某地指出发生了什么事情,以及该采取何种对策。但为了真正解决问题,当地可能并没有足够多的信息。因此,我们需要将其移交给更级的负责人,令其作出正确的决定(类似一个命令链)。
其实就是发生一些异常的时候,给出java相应的指示:现在程序发生异常了,我该怎么做,你要是不告诉我的话,我就停止运行了!
- 基本异常的产生:
- 手动抛出:当满足一定的条件时,程序员认为这个时候即可认为发生了“异常”,这个时候就可以手动抛出异常对象
@Test
public void test2() throws Exception{
if(true){
throw new Exception();
}
} 程序自己抛出:当程序认为不满足合法要求的时候,Java本身也会自动抛出相应的异常:
@Test
public void test3() {
int i = 1 / 0;
/*
* java.lang.ArithmeticException: / by zero at
* Mytest.Test01.test3(Test01.java:68) at
* sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at....
*
*/
}
- 手动抛出:当满足一定的条件时,程序员认为这个时候即可认为发生了“异常”,这个时候就可以手动抛出异常对象
异常的捕获try{}catch(){}
往往发生异常的时候我们都需要受益人采取一定的措施,那么如何我们怎么知道什么时候发生异常了,发生了什么样的异常了呢?@Test
public void test4() {
try {
/* 正常的代码放在try{}中 */
int i = 1 / 0;// 肯定会发生ArithmeticException的异常
} catch (ArithmeticException e/*当发生ArithmeticException异常应该做什么*/) {
System.out.println("ArithmeticException");//ArithmeticException
} catch (NullPointerException e/*当发生NullPointerException异常应该做什么*/) {
System.out.println("NullPointerException");
}catch(Exception e/*当不知道会发生什么异常的时候,可以用Exception来捕获,注意cacth的顺序是:范围大的放下面*/){
System.out.println("Exception");
}
}值得注意的是:当其中一个对应的catch捕获到异常以后,别的catch是不会再运行的了
- throw(抛出)与throws(声明)
当你的方法中,throw出了一个异常,你又不想做出对应的解决方案:即,try...catch..那么别人使用你的方法只有两种选择:一,我来处理。二,我也不处理,我也只是告诉别人我这方法中有哪些异常;所以你的方法中必须要告诉别人我这个方法中throw出了哪些异常,java违例规范中就强制我们当方法中的发生的异常(运行时异常除外),你不处理的时候,你必须指出方法中的哪些异常,这个时候就是throws的指明的时候了:@Test
public void test5() throws IllegalClassFormatException {
if(1<2){
throw new RuntimeException();//运行时异常,不用处理
}
if(2>3){
throw new IllegalClassFormatException();//不进行处理时,必须通过throws声明出
}
if(3>4){
try {
throw new Exception();//进行try{}catch(){}处理
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} - 自定义异常:extends Exception
class MyException extends Exception{} - 继承时,覆盖的方法中不能抛出比父类多的异常:
public class Parent {
public void a() throw AException {
}
}
public class Child extends Parent {
public void a() throw AException, BException {
}
} public class Test {
public void main(String[] args) {
Parent p = new Child();
try {
p.a();//这里在调用者就不知道抛出BException了!这样就会导致一些问题
} catch(AException e) {
doSomething();
}
}
} - finally{}
当有些逻辑不管程序有没有发生异常,都必须要被执行的话可以放在finally中。@Test
public void test01() {
try{
int i=1/0;
System.out.println("this is a very important");
}catch(Exception e){
System.out.println("****************");//当代码执行到1/0时,会发生异常,程序会到catch{}中,执行******故important不会执行
}
}@Test
public void test01() {
try{
int i=1/0; }catch(Exception e){
System.out.println("****************");
return;
}finally{
System.out.println("this is a very important");
//即使当程序执行到1/0后,程序抓到异常,执行catch块并且return,finally还是会执行
}
}注意:finally是在return前执行的,执行完以后return;
那么什么情况下finally是不会被执行的呢?
@Test
public void test01() {
try{
int i=1/0; }catch(Exception e){
System.out.println("****************");
System.exit(-1);//终止java虚拟机的运行
}finally{
System.out.println("this is a very important");
//即使当程序执行到1/0后,程序抓到异常,执行catch块并且return,finally还是会执行
}
} - java异常体系中的缺陷
@Test
public void test02 () throws Exception{
try {
int i=1/0;
} finally {
throw new Exception("我是exception");
}
}分析可知,按理说,上面的程序应该先抛出ArithmeticException,再抛出Exception,可结果:

ArithmeticException没有了!!这在thinking in java中已经提出,但到1.8版本并没解决
重新开始学习javase_Exception的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
随机推荐
- c#:类 相关练习;
1. 2. int i = a.Length;//获取字符串的长度 a = a.ToLower();//将字符串中的大写英文字符转化为小写 a = a.ToUpper();//将字符串中的小写 ...
- Linux2.6内核--内存管理(2)--区
由于硬件的限制,内核不能对所有的页一视同仁.有些页位于内存中的特定物理地址上,所以,不能将其用于一些特别的任务.(关于内存分页机制可以查看:http://blog.csdn.net/dlutbruce ...
- 如何解决设置Session保存在StateServer后引起WebService/WebMethod无法异步获取Session
项目中有一个文件上传功能,需要显示文件上传进度.于是使用PageMethods 调用WebService/WebMethod . 在demo中测试一切正常.但是转移到项目中之后无法异步刷新文件上传进度 ...
- Cent OS 命令行和窗口界面默认登录切换方法
在 CentOS 中的修改方法如下: 1. root登陆,免得老是sudo 2. 打开/etc/inittab 文件 #vim /etc/inittab 3. 在默认的 run level 设 ...
- 有关linux下redis overcommit_memory的问题(转)
一.背景 公司的redis有时background save db不成功,通过log发现下面的告警,很可能由它引起的: [13223] 17 Mar 13:18:02.207 # WARNING ov ...
- 【转】java提高篇(二三)-----HashMap
原文网址: http://www.cnblogs.com/chenssy/p/3521565.html HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以 ...
- datagridview,textbox,combobox的数据绑定,数据赋值,picturebox的用法
一:datagridview数据绑定 二:textbox的数据绑定(datetimepicker) 总结: 最好还是写成双向绑定那种,不要再写出发事件了,只要在给textbox赋值就能重新绑定了,不然 ...
- POJ 2057 The Lost House
题意:一只蜗牛,它的房子在树上的某个叶子节点上,它要从树的根节点出发,寻找自己的房子.树的任意两个节点的距离为1,房子出现在每个叶子节点上的可能性一样.有的节点上有虫子,如果有虫子,虫子会告诉蜗牛它的 ...
- redis学习心得之二【redis主从配置】
在前一节我们已经实践启动了一个redis服务,我们将其作为主机,现为其创建一个从机作备份使用 1.复制一份配置出来为从机所用 ~$ cp redis/etc/redis.conf ...
- Mysql binlog日志解析
1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...