异常

定义:

        在程序正常运行的时候,发生不正常的事件;不正常事件会阻断程序的运行。

处理:

异常三种情况:

        第一种情况:代码块1未产生异常,catch块不执行,执行catch块后的代码块3

try{       

代码块1(未产生异常)

}catch(异常类型  异常类型对象 ){

代码块2

}

代码块3

        第二种情况:代码块1产生异常,异常类型匹配,执行catch块及之后的代码块3

try{       

代码块1(产生异常)

}catch(异常类型  异常类型对象 ){

代码块2

}

代码块3

        第三种情况:代码块1产生异常,异常类型不匹配,终止整个程序的运行!

try{       

代码块1(产生异常)

}catch(异常类型  异常类型对象 ){

代码块2

}

代码块3

异常类型:

try catch  finally 的使用只有以下三种情况:

public class Test {

public static void main(String[] args) {

try {

} catch (Exception e) {

}

try {

} finally {

}

try {

} catch (Exception e) {

}finally {

}

}

}

验证结果:

System.exit(status);  status有两种取值情况:

0的时候表示正常退出jvm,非0的时候表示非正常退出jvm。(结果都是一样的,从此处终止程序继续运行)

System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点:   return是回到上一层,而System.exit(status)是回到最上层;

在一个if-else判断中,如果我们程序是按照我们预想的执行,到最后我们需要停止程序,那么我们使用System.exit(0),而System.exit(1)一般放在catch块中,当捕获到异常,需要停止程序,我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。

按照以下顺序执行return的前提——return有机会被执行且存在finally块!

try块中有return语句,与上图类似;

下图注意事项:父类只能放在最后(否则编译错误)

package org.gaofuzhi.test2;

public class Test {

public static void main(String[] args) {

try {

String str ;

str = null;

System.out.println(str.equals("test"));

System.out.println("我执行了");

}catch (ArithmeticException e) {

System.out.println("我执行了1");

}catch (NullPointerException e) {

System.out.println("我执行了2");

}catch (Exception e) {

System.out.println("我执行了3");

}

finally {

System.out.println("谢谢您的使用");

}

}

}

结果:

体系结构:

注意事项:

        因为Exception为yChecked异常与Runtime异常的父类,jvm无法预料到异常是属于Checked异常或Runtime异常,所以要求必须处理(因为Checked异常在编译的时候即需要进行处理)。

声明异常:

        使用关键字throws 声明某个方法可能出现的异常,如果有多个异常,用” ,“隔开即可。

        通常定义方法时声明异常,而由调用者处理异常;如果调用者继续声明异常,最后(main方法声明的也一样)的异常由java虚拟机进行 ”处理“(实际上结果类似声明,约等于报错)。

RuntimeExeption异常无论定义方法中是否声明或处理(try-catch),调用方法中可处理可不处理;

Checked异常如果在定义方法时声明异常,则调用方法必须声明异常然后由java虚拟机进行处理(try-catch)或直接进行try-catch处理;

Checked异常如果在定义方法时处理异常(不推荐),则调用方法没有必要进行声明或处理(try-catch)。

抛出异常:

程序员自己设置抛出异常的条件(比如年龄大于150岁就抛出异常)!

如果抛出的异常为Checked类型异常,则必须进行声明或处理。eg:

throw   new   Exception (“年龄必须介于1~150岁之间”);//必须进行处理或声明(建议声明)

在调用方法中进行处理(建议)(catch中可使用e.getMessage();获取以上异常输出信息(“年龄必须介于1~150岁之间”))。


自定义异常类:

package exception;

/**

* @author gaofuzhi

*/

public class Person {

private int age;

public int getAge() {

return age;

}

public void setAge(int age) throws AgeException {

if(age<0||age>150){

throw  new AgeException("年龄介于1~150岁之间");

}

this.age = age;

}

}

package exception;

/**

* 自定义异常类

* @author gaofuzhi

*/

public class AgeException  extends Exception{

private static final long serialVersionUID = 1L;

public AgeException() {

super();

}

public AgeException(String message) {

super(message);

}

}

package exception;

/**

* 年龄测试类

* @author gaofuzhi

*/

public class AgeExceptionTest {

public static void main(String[] args) {

Person lily = new Person();

try {

lily.setAge(190);

System.out.println(lily.getAge());

} catch (AgeException e) {

e.printStackTrace();

}

}

}

异常链:

将两个或多个异常类的异常信息像链一样传递下去!

package exception;

/**

* 自定义异常类1

* @author gaofuzhi

*/

public class MyException1  extends Exception{

private static final long serialVersionUID = 1L;

public MyException1() {

super();

}

public MyException1(String message) {

super(message);

}

}

package exception;

/**

* 自定义异常类2

* @author gaofuzhi

*/

public class MyException2  extends Exception{

private static final long serialVersionUID = 1L;

public MyException2() {

super();

}

public MyException2(String message) {

super(message);

}

public MyException2(String message, Throwable cause) {

super(message,cause);

}

}

package exception;

/**

* 年龄测试类

* @author gaofuzhi

*/

public class MyExceptionTest {

public static void main(String[] args) {

MyExceptionTest e = new MyExceptionTest();

try {

e.A();

} catch (MyException2 e2) {

e2.printStackTrace();

}

}

public void A() throws  MyException2{

try {

B();

} catch (MyException1 e1) {

//这里将MyException1的对象通过有参构造方法传递给MyException2

//像链一样将二者联系了起来——称之为异常链

throw new MyException2("我是异常类2的异常信息",e1);

}

}

public void B() throws MyException1{

throw new MyException1("我是异常类1的异常信息");

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容