黑马程序员——异常以及如何规避异常

来源:互联网 发布:淘宝号怎么会被冻结 编辑:程序博客网 时间:2024/06/03 17:47

           ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1异常

异常就是不正常,是指程序在运行时出现的不正常情况,其实就是程序中出现的问题,这个问题按照面向对象思想进行描述并封装成了对象,方便于操作问题和处理问题

 

Throwable类是Java语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才通过Java虚拟机或者Java Throw语句抛出。类似的,只有此类或其子类之一才可以是catch子句中的参数类型。该类有两个直接子类,即Error和Exception


Error用于指示合理的应用程序不应该试图捕获的严重问题

Exception用于指出合理的应用程序想要捕获的条件


Exception又可以分为两类,即RuntimeException(程序本身的错误导致的异常)和其他异常

下面是几种常见异常以及规避办法

ArithmeticException是算数异常,它通常发生在运算错误时,如整数为0



ArrayStoreException是试图将错误类型的对象存储到一个对象数组时抛出的异常

如何避免ArrayStoreException

通常情况下IDE会报告这类异常,单数如果数组引用类型是Object就不会。所以一定要最小化数组的类型,能声明确定类型的就不要用Object类型,\只有在数组元素赋值时,注意元素的类型,就可以很容易的避免这个错误


ArrayIndexOutofBoundsException是用非法索引访问数组时抛出的异常

如果索引为负数或者大于等于数组大小,则该索引为非法索引

如何避免ArrayIndexOutOfBoundsException

如果要遍历数组中的全部元素,则推荐使用加强版的for循环,它可以避免数组的下标运算

如果要使用数组的下标,则需要记住数组的下标是从0开始计算的,如果需要使用数组的长度则推荐使用length属性,使用ArrayList类也可以避免这些问题


NullPointerException空指针异常

当应用程序试图在需要对象的地方使用null时,抛出空指针异常这种情况包括

调用null对象的实例方法

访问或修改null对象的字段

将null作为一个数组,获得其长度

将null作为一个数组,访问或修改其元素值

将null作为Throwable值抛出

如何避免出现NullPointerException

推荐在创建引用类型变量之后立即对其赋值,这样可以避免以后出现空指针异常如果不能立即对其进行操作,则在使用引用变量时,需要使用条件判断语句,先判断是否为空,再使用相关方法


ClassNotFoundException(类未发现异常)

当应用程序试图使用以下方法通过字符串加载类时,抛出ClassNotFoundException

class类中的forName方法

ClassLoader类中的findSystemClass方法

ClassLoader类中的loadClass方法

如何避免ClassNotFoundException

如果使用IDE。则会对用户直接使用不存在的类进行提示,如果使用Class类来加载

则根据输出的异常信息来判断有没有引入相关jar包。


IllegalAccessException是当应用程序试图反射性的创建一个实例(而不是数组),设置或者获取一个字段或

调用一个方法,但当前正在执行的方法无法访问指定类,字段或构造方法的定义时抛出的异常

如何避免IllegalAccessException

出现该异常最常见的情况是在有安全管理器的情况下使用反射设置私有域的值,如果要修改该值,则必须使用setAccessible()修改其可见性,对于应用程序员而言,通常不能使用反射来访问私有域


FileNotFoundException在试图打开指定路径名表示的文件失败时抛出,在不存在具备指定路径名的文件时,该异常将由FileInputStream,FileOutputStream和RandomAccessFile构造方法抛出。如果该文件存在但是由于某些原因不可访问,如试图打开一个只读文件进行写入,则此时这些构造方法仍会抛出异常

如何避免FileNotFoundException

如果不能确定文件是否存在,则可以使用File类的exists()方法进行判断。如果返回值为真,则可以进行流操作,否则需要提示用户文件不存在,也可以使用文件选择器让用户来选择需要操作的文件(非只读文件)


SQLException数据库操作异常;提供关于数据库访问错误或其他错误的异常

如何避免SQLException

在使用JDBC连接数据库时,会出现大量的SQLException,为了让代码更加清晰。推荐使用CommonUtils组件来进行JDBC操作

使用throw关键字可以在方法体中抛出异常,该异常既可以是系统预定义异常有可以是用于自定义异常

对于暂时不想或不好处理的异常,可以使用throws在方法声明上将其抛出。当重写继承时,抛出的异常不能比超类范围大,或者不抛出异常

一个方法可以抛出多个异常,也可以只抛出他们的父类如Exception

 

 

异常处理两种方式

1捕获异常 try catch  直接处理可能出现的异常

2声明异常 throws   声明告诉调用者可能出现的异常,暴露问题,调用者自己处理

 

总结

Exception和Error的子类名大都是一父类名作为后缀

Java异常其实是对不正常情况的一种描述,并将其封装成对象

Java在设计异常体系时,将容易出现的异常情况都封装成了对象

 

异常处理格式

异常处理的5个关键字

try ,catch

finally

throw,throws

总结

捕获异常:先捕获小异常再捕获大异常

程序是调出来的,不是写出来的。多测试是程序员的必修课

异常处理后,程序捕获因为出现异常而退出

 

异常处理格式

try{

//可能出现异常的代码

 

}catch(异常类 对象)

{

//处理该异常类型的语句

 

}finally{

//一定会执行的代码

//catch块使用System.exit(1);除外

}

备注:当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,并执行异常处理语句,finally语句块是异常的统一出口

 

3多异常处理

声明异常时,尽可能声明具体异常类型,方便更好的处理

方法声明几个异常就对应几个catch块

若多个catch块中的异常出现继承关系,父类异常catch块放在最后

在catch语句块使用Exception类作为异常类型时;

所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都使用Exception接收

注意:在Java处理多异常时捕获小范围的异常必须放在大范围异常之前

//代码

 

 

4异常的分类

编译时被检查异常  checked异常

在程序中必须使用try catch处理

编译时不被检测的异常  runtime异常

可以不使用try catch处理,但一旦出现异常就将由JVM处理

 

 

5、声明异常(throws)

当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeException类型的异常)。

方法一旦使用throws声明抛出方法内可能出现的异常类型, 该方法就可以不再过问该异常了;

一个方法调用另一个使用throws声明抛出的方法,自己要么try...catch, 要么也throws;

格式:

public 返回值类型  方法名(参数列表...)

                            throws 异常类A,异常类B... {

        

}

6、throw

自行抛出一个异常对象,抛出异常类的对象;

若throw抛出的是Runtime异常:

程序可以显示使用try...catch来捕获并处理,也可以不管,直接交给方法调用者处理;

若throw抛出Checked异常:

要么放在try里自己处理,要么放在一个throws声明的方法里面,交给调用者处理。

 

throws & throw

 

throws用于在方法上声明该方法不需要处理的异常类型。

throw用于抛出具体异常类的对象。

throws与throw的区别:

thorws用在方法上,后面跟异常类名,可以是多个异常类。

throw用在方法内,后面跟异常对象,只能是一个。

7、finally

 

异常的统一出口:

不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。

try语句块或会执行的catch语句块使用了JVM系统退出语句例外;//System.exit(1);

try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。

不要在finally中使用return 或throw语句,否则将会导致try、catch中的return或throw失效。

 

我的总结:finally代码块只在一种情况下不执行:System.exit(0)

 


/*Java中捕获异常通过try,cacth,finally三个块来完成,其实try块是必需的,catch和finally可以选择一个或两个try块用来放置可能出现问题的语句,catch用来放置异常发生后执行的代码,finally用来放置无论是否发生异常都需要执行的代码捕获异常是一个高开销的操作,因此try中的语句应该尽量少*/class  CatchException{public static void main(String[] args) {try{System.out.println("进入try块");Class<?> clazz=Class.forName("");System.out.println("离开try块");}catch (ClassNotFoundException e){System.out.println("进入catch块");e.printStackTrace();System.out.println("离开catch");}finally{System.out.println("进入finally");}}}


 

 


0 0