02 异常处理

1.体系结构

java.lang.Object

|----java.lang.Throwable

|-------java.lang.Error:错误,java程序对此无能为力,不显式的处理

|-------java.lang.Exception:异常。需要进行处理

|------RuntimeException:运行时异常

|-----ArrayIndexOutOfBoundsException/NullPointerException/ArithmeticException/ClassCastException

|------非RuntimeException:编译时异常

2.因为java程序分为javac.exe和java.exe两个过程,在每个过程中,都有可能出现异常。故分为编译时异常、运行时异常

2.1 对于运行时异常比较常见,可以不显式的来处理。

2.2 对于编译时异常,必须要显式的处理

编译时异常,不是说有异常才处理,而是存在异常的隐患,必须在编译前,提示程序,万一出现异常,如何处理!

2.如何处理异常?

java 中的“抓抛模型”

* 1."抛":当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应的异常类型的对象,并

*        将此对象抛出。(自动抛出   / 手动抛出)

*        >一旦抛出此异常类的对象,那么程序就终止执行

*        >此异常类的对象抛给方法的调用者。

* 2."抓":抓住上一步抛出来的异常类的对象。如何抓?即为异常处理的方式

*    java 提供了两种方式用来处理一个异常类的对象。

*    处理的方式一:

*    try{

*        //可能出现异常的代码

*    }catch(Exception1 e1){

*        //处理的方式1

*    }catch(Exception2 e2){

*        //处理的方式2

*    }finally{

*        //一定要执行的代码

*    }

* 注:1.try内声明的变量,类似于局部变量,出了try{}语句,就不能被调用

*    2.finally是可选的。

*    3.catch语句内部是对异常对象的处理:

*        >getMessage();  printStackTrace();

*    4.可以有多个catch语句,try中抛出的异常类对象从上往下去匹配catch中的异常类的类型,一旦满足

*      就执行catch中的代码。执行完,就跳出其后的多条catch语句

*    5.如果异常处理了,那么其后的代码继续执行。

*    6.若catch中多个异常类型是"并列"关系,孰上孰下都可以。

*      若catch中多个异常类型是"包含"关系,须将子类放在父类的上面,进行处理。否则报错!

*    7.finally中存放的是一定会被执行的代码,不管try中、catch中是否仍有异常未被处理,以及是否有return语句。

*    8.try-catch是可以嵌套的。

处理方式二:

在方法的声明处,显式的使用throws + 异常类型

public void method1()  throws Exception1 e1,Exception2 e2{

//可能出现异常(尤其是编译时异常,一定要处理)

}

public void method2() throws Exception1 e1,Exception2 e2{

method1();

}

public void method3(){

try{

method2();

}catch(Exception1 e1){

System.out.println(e1.getMessage());

}catch(Exception2 e2){

System.out.println(e2.getMessage());

}

}

public static void main(String[] args){

对象1.method3();//不会再出现上述的Exception1和Exception2的异常!

}

3.如何手动的抛出一个异常?

在方法的内部,可以使用  throw + 异常类对象,来手动的抛出一个异常!

//比较两个圆的半径的大小。

public int compareTo(Object obj) throws Exception{

if(this == obj){

return 0;

}

else if(obj instanceof Circle){

Circle c = (Circle)obj;

if(this.radius > c.radius){

return 1;

}else if(this.radius == c.radius){

return 0;

}else{

return -1;

}

}else{

//return -2;

//手动的抛出一个异常

//throw new Exception("传入的类型有误!");

//throw new String("传入的类型有误!");

throw new MyException("传入的类型有误!");

}

}

4.如何自定义一个异常类?

>手动的抛出一个异常,除了抛出的是现成的异常类的对象之外,还可以抛出一个自定义的异常类的对象!

>如何自定义一个异常类呢?

*/

//自定义异常。描述Person的年龄数值非法。

/**

只要是本项目的Person的年龄出现非法值就会发生该异常。

*/

class NoAgeException extends RuntimeException

{

/*

为什么要定义构造函数,因为看到Java中的异常描述类中有提供对问题对象的初始化方法。

*/

NoAgeException()

{

super();

}

NoAgeException(String message)

{

super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。

}

}

class Person

{

private String name;

private int age;

Person(String name,int age)

{

//加入逻辑判断。

if(age<0 || age>200)

{

throw new NoAgeException(age+",年龄数值非法");

}

this.name = name;

this.age = age;

}

//定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。

public String toString()

{

return "Person[name="+name+",age="+age+"]";

}

}

class ExceptionDemo5

{

public static void main(String[] args)

{

Person p = new Person("xiaoming",-20);

System.out.println(p);

}

}

时间: 2024-12-28 11:21:46

02 异常处理的相关文章

Java进阶02 异常处理

程序很难做到完美,不免有各种各样的异常.比 如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我们还可以提供 一定的应对预案.C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的.程序员需要查询大量的资料,才可能找到一个 模糊的原因.面向对象语言,比如C++, Java, Python往往有更加复杂的异常处理机制.这里讨论Java中的异常处理机制. Java异常处理 异常处理 Jav

学习笔记02 异常处理

抛异常分为两种方式,一种是抛出异常就处理异常就是所谓的try{}catch(){},还有一种就是IOException回避异常,就是在出现异常时不处理,在调用此方法时处理该异常,什么时候调用,什么时候处理异常. import java.io.*;public class Ex6_2 { /** * @param args */ public static void main(String[] args)throws IOException{ // TODO Auto-generated meth

异常处理的设计与重构 pdf

网上没找到pdf文件,自己买了一本.需要pdf的留言,当天有空会发给你,免费. 目录: Part1异常处理的现状 Chapter01你对异常处理的了解有多少? 02异常处理的重要性 03"种花"电信,我真是猜不透你啊! 04HTCOneX--发现一个Bug 05HTCOneX--我只是想打通电话呀! 06HTCOnex--拍照的错误消息描述 07可靠性可以是一门生意 ColumnA.倒霉的人很适合当神秘客 Part2异常处理的基本观念 Chapter08强健性大战首部曲--魅影危机 C

25 Python - 异常处理及测试

异常处理及测试 01常见错误类型 语法错误:SyntaxError 语义错误:如除以0 逻辑错误:重新分析过程排查 02异常处理 语法:try Except  用于捕获异常 else    都没有异常加一个else finally(最终都要执行的内容,如文件打开后需要关闭,或数据库需要释放资源) raise 自己抛出异常 03简单代码测试——测试方法 待测试函数 测试类 测试结果 成功 失败 04 代码测试——测试一个类 待测试类 较复杂的测试类方法——如果该类有很多属性,需要一个一个的输入 简

java入门

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和多重继承.

Java快速教程

Java快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比

转载:Java快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响. Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和多重继承

Java快速教程--vamei 学习笔记(进阶篇)

感谢vamei,学习链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html Java进阶01 String类 学习链接:http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html 字符串操作 ---------------------------------------------------------------------------------------

java Vamei快速教程15 IO基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机最重要的功能是处理数据.一个有用的计算机语言需要拥有良好的IO功能,以便让未处理的数据流入程序,让已处理的数据流出. 与其他语言相比,Java的IO功能显得复杂.在其他语言中,许多IO功能(比如读取文件),是被封装好的,可以用一两行程序实现.在Java中,程序员往往需要多个层次的装饰(decoration),才能实现文件读取. 相对的复杂性带来的好处是IO的灵活性.在Jav