黑马程序员-java Exception异常个人知识整理
来源:互联网 发布:淘宝上做什么产品好 编辑:程序博客网 时间:2024/05/01 03:30
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
对于程序而言,出现的错误可以分为三类:
编译错误:没有遵循java语法规则,这种错误需要在编译阶段进行处理,否则程序不能运行。
逻辑错误:没有按照对应的逻辑来运行,但是编译正确,能正常运行,只是结果错误。
运行时错误:运行的过程中出现的不可执行的操作,在运行时报错。
在java程序中,什么异常?
异常:是程序执行期间发生的各种意外或错误,它会中断指令的正常执行,影响程序的正常运行,比如说:找不到文件、内存不足、数组下标越界和输入出错等问题。
在Java中异常分为两大类:编译异常和运行异常!
产生的异常可以细分为三种类型:
1.java虚拟机在运行时,由于某些内部错误产生的异常,这类异常不在用户程序的控制之内,也不需要进行处理的这类异常。
2.标准类异常,java系统预先定义好的,由于程序代码中的错误而产生的,这里需要对程序异常进行处理。
3.用户自定义的一个异常类,但是他需要继承java的异常类。
Java 语言中,错误类的基类是java.lang.Error,异常类的基类是java.lang.Exception,所有Error(错误)或Exception(异常)的超类是Throwable 类,当对象是此类或者其子类的实现,才能使用异常抛出thow语句和作为catch 子句中的参数类型;
Error类:java虚拟机本身发生的错误,表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件的问题,比如,内存溢出等,对于这种错误程序基本无能为力,除了退出运行别无选择,所以将通知用户并且中断程序运行。
Exception类:表示一种设计或者实现问题,需要进行捕捉或者需要程序进行处理的异常,其中分为运行时异常(RuntimeException)和非运行时异常,其中RuntimeException可以不对其进行处理,但是非运行时异常就必须捕获或者申明抛出的异常。
在处理异常时,应该区分checked和unchecked:
unchecked:就是Error和RuntimeException(运行时异常)的统称, 不需要try...catch...或throws 机制去处理的异常。
checked:除了Error和RuntimeException,其他继承于java.lang.Exception的类,需要进行异常处理的类。这里需要注意的缺点是:代码效率低,耦合度过高
java异常类的结构图如下:
注:异常是针对方法来说的,抛出、声明、捕获和处理异常都是在方法中进行的;进行异常捕获时,先捕获小的异常,再捕获大的异常。
首先,那我们就来明确下异常处理的目的:
主要目的是即使在程序运行时发生了错误,也要保证程序能正常结束,避免由于错误而使正在运行的程序中途停止。
java对异常的处理涉及两个方面内容:
1.抛出(throw)异常:程序运行的过程中出现了运行错误,能匹配预定义的某个异常类,那么系统就产生一个该异常类的对象,这个过程称其为抛出异常。
2.捕捉(catch)异常:根据抛出的异常对象,进行匹配处理的过程,叫做捕捉异常。
抛出异常的方式有两种:系统自动抛出和人为异常抛出。
其中,需要注意的是人为抛出,有两种形式:
1.在方法头写出需要抛出的异常(利用throws语句),例如下面代码:
throws的格式的:修饰符 返回值类型 方法名([参数列表])throws 异常类名1,异常类名2,……{方法体}
public class Throws_Exp{public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException{ int a=4,b=0,c[]={1,2,3,4,5};System.out.println(a/b);System.out.println(c[a+1]);}}
2.在方法体内抛出异常(利用throw语句),例如下面代码:
throw的格式:throw 异常类对象名 / (new 异常类名());
public class Throw_Exp {public static void main(String[] args) {int a = 3, b = 0,c[]={1,2,3,4,5};ArithmeticException e=new ArithmeticException();if (b == 0)throw e;System.out.println(a / b);if (c.length <= a)throw (new ArrayIndexOutOfBoundsException());System.out.println(c[a]);}}
注:执行throw语句时,程序将不会再执行throw后面的语句。
由于上面的程序没有进行异常的处理,因此抛出的异常都java系统自动捕捉,进行相应的处理。那么按照java规范来说,能够预测程序中可能发生的异常,则应该对异常进行处理,否则,交给java系统处理。
那么自己捕捉和处理异常,要通过try-catch-finally语句块,用法如下:
try{ //在此区域内或能发生异常;}catch(异常类A e1) { //该catch子句能够捕捉和处理的异常类型//处理异常A;}catch(异常类B e2){//处理异常B; }finally{//不论异常是否发生,都要执行的部分; }
对于try-catch-finally结构的说明:
A:将可能发生异常的程序代码放置在try程序块中。如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。如果程序运行正常,后面的各catch块不起任何作用。
B:finally块是个可选项,无论异常是否发生,finally块的代码必定执行。通常把对各种异常共同处理部分放在finally块中,如输出统一信息、释放资源、清理内存、关闭已打开的文件等。
C:一个try块可以对应多个catch块,用于对多个异常类进行捕获。但最多只能选中一个执行。
D:异常对象与catch块中声明的实例的匹配原则:
1.异常对象是catch块中声明的异常类的实例;
2.异常对象是catch块中声明的异常类的某一子类的实例;
注意:
1.try-catch-finally结构里面出现return语句,finally{}里面的代码先执,然后在执行return语句。
2.使用System.exit(1)来退出虚拟机,则finally{}中的语句将不会被执行。
示例代码如下:
public static void close(Connection conn){try{if(conn != null){conn.close(); //关闭数据库链接}}catch(Exception e){ //System.out.println(e.getMessage()); //打印报错信息}finally{conn = null; ////强制释放conn链接}}
自定义的异常类:异常类必须是Throwable类或Exception类的子类。
自定义的异常类,一般只要声明两个构造方法,一个是不用参数的,另一个以字符串为参数。作为构造方法参数的字符串应当反映异常的信息。
实例代码如下:
public class MyFirstException extends Exception {public MyFirstException(){super(); }public MyFirstException(String msg) {super(msg);}}
注:用户定义的异常同样要用try--catch捕获,但必须由用户自己抛出 throw new 定义的异常类名();
Java异常处理的原则和技巧:
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
- 黑马程序员-java Exception异常个人知识整理
- 黑马程序员---java基础之异常(Exception)
- 黑马程序员--Java基础之异常Exception
- 黑马程序员--------java基础 Exception (异常)
- 《黑马程序员》java异常知识梳理
- 黑马程序员--Java基础常见异常整理
- 黑马程序员- java-Exception
- 奋斗黑马程序员----Java异常(Exception)介绍
- 『黑马程序员』---java--异常Exception机制
- 黑马程序员—java基础学习--异常(exception)
- [黑马程序员]——java中的异常Exception
- JAVA异常知识整理
- Java异常知识整理
- 黑马程序员_Jsoup知识整理
- 黑马程序员 java中的异常处理个人总结
- 黑马程序员 java中的异常和包个人总结
- 异常知识总结------------黑马程序员
- 黑马程序员—Java编程异常知识总结
- 黑马程序员_学习日记1(java入门前准备)
- json simple 实例
- [OS] malloc()函数的工作机制
- __main main 注意最后跳转到应用程序的那部分说明
- Android中Ringtone播放详解【安卓源码解析五】
- 黑马程序员-java Exception异常个人知识整理
- epoll精髓
- AsyncTask原理分析与Demo
- javaBean和xml之间的相互转换
- Java的访问权限知识
- String 类型如何转变为Timestamp类型
- (2013.03.08)求最大公约数_3种算法
- Android中Notification的framework层讲解【安卓源码解析四】
- 选项卡切换