Java之异常

一、错误

1、定义:程序运行时的不正常状态。

2、分类:

(1)致命性:

可能会导致系统崩溃,并且我们不能通过编写程序来解决它。

(2)普通级别:(这类错误一般称为异常,也叫例外,即exception)

可能会导致程序非正常中断,但可以通过编写相关代码去处理。


二、异常

1、分类:

1)常见异常有:


ArithmeticException异常。进行表达式运算时,除数不能为0。

ArrayIndexOutOfBoundsException异常。数组下标越界异常。

IncompatibleClassChangeException异常。类不兼容异常。当修改一个类定义后,引用该类的其他类没有重新编译,就会产生

该异常。

IncompatibleTypeException异常。类型不兼容异常。若试图定义一个接口实例,则会引发该类异常。

NegativeArraySizeException异常。数组元素个数为负异常。NoClassDefFoundException异常。类未定义异常。若一个类被引用,但在运行时,系统并没有找到被引用的类,就会引发该异常。

NoClassDefFoundException异常。类未定义异常。若一个类被引用,但在运行时,系统并没有找到被引用的类,就会引发该异常。

NullPointerExcion异常。空指针异常。若一个对象的值是null.而程序试图访问它的变量或方法或者访问空数组中的元素时,会引发该类异常。

OutOfMemoryException异常。内存溢出异常。当系统无法再向应用程序提供内存时,会引发该异常。

SecurityException异常。安全方面的异常,一般在浏览器内抛出。若java小程序试图进行不安全的操作时,则会抛出该类异常。

ArrayStoreException 数组存取异常。试图存取数组中错误类型的异常。

FileNotFoundException 文件不存在异常。 试图存取一个并不存在的文件。

IOException  I/O异常 通常的I/O错误。

2、按是否捕获分类:

1)免检异常:eg:RuntimeException

2)必检异常:“必须被一个方法捕获,或必须列在抛出它或传播它的任一方法的throws子句中。”


例如

I/O操作必须捕获异常,而遍历数组元素时不需要由程序员控制,系统自动对数组做检查。像内存耗尽,访问到数组末尾等这样的操作也由系统来完成。

三、异常处理

分两步:找、改。

1、处理异常的步骤:

1)找到可能出现异常的地方。

2)编写代码来处理异常。

2、JAVA中的异常处理语句

try、catch、finally

1)try

a、可以圈出可能出现异常的语句块

b、”一个try块可以有几个catch子句与之对应”

2)catch

a、划分异常种类并进行处理

b、“每个catch子句称为一个异常处理器”

c、try后不一定要有catch语句。如果没有catch语句,可用finally。

3)finally

a、圈出不管是否有异常产生,都会执行的代码。

【即使try所圈定的代码中有return、break、continue、throw等,

finally中的语句也会执行

b、”try语句括住的代码称为保护代码”

c、finally语句不会被执行的有且只有一种情况:

在保护代码即在try内执行了System.exit()方法。

System.exit()方法是用来结束当前正在运行中的java虚拟机的。

d、finally语句可有可无,并且若是有,则总是写在catch之后。

引用部分:

try
{
//此处为抛出具体异常的代码
}catch(ExceptionType1 e)
{
//抛出ExceptionType1异常时要执行的代码
}catch(ExceptionType2 e)
{
//抛出ExceptionType2异常时要执行的代码
.......
}catch(ExceptionTypek e)
{
//抛出ExceptionTypek异常时要执行的代码
}finally
{
//必须执行的代码
}

1)其中,ExceptionType1、ExceptionType2...

ExceptionTypek是产生的异常类型,根据发生异常所属的类型,找到对应的catch语句并执行,执行完毕后系统将不再与其他的异常类型进行比较。


3、try-catch-finally语句执行顺序

try-当抛出异常→跳转到相应的catch处→执行catch语句→跳转到tey-catch后的语句(如果有finally就执行finally)

try-没有抛出异常→跳转到所有catch之后的语句。

4、处理异常的方法:

1)不进行任何处理

2)在异常发生的地方处理

3)在除异常发生的其他地方处理

比如:在程序的某方法出现异常后,该异常被传递到其他方法后才被处理

4、抛出语句

1)

如果在发生异常的方法内没有捕获并处理它,控制立即转去产生异常的这个方法的调用方法。如果在调用方法那儿也没有捕获,控制在转向调用它的调用方法,依此类推。这个过程称为异常传播。

这是处理异常的另一种方法。即在程序的其他地方处理异常。异常一直被传播,直到捕获并处理它,或是传出main方法,后者将导致程序中断,并产生一条异常信息。

要想在某一层捕获异常,必须在try块内调用产生异常的这个方法,并且该try块还要有catch子句来处理这个异常。


2)抛出语句的格式:

访问权限修饰符 返回值类型  方法名 (参数列表)throws  异常列表
a、”紧接在关键字throws后面的是该方法内可能发生且不进行处理的所有异常列表。抛出的异常可以有多个,各异常之间以逗号分隔。”

b、“一般地,如果一个方法引发了一个异常,而它自己又不处理,就要由其调用方法进行处理。

在子类中一个重写的方法可能只抛出父类中声明过的异常或其子类。

如果一个方法有完全相同的名称和参数,它只能抛出父类中声明过的异常或者异常的子类。

捕获多个异常时,应先捕获特殊的异常,即异常子类,然后才能捕获更一般的异常,即异常父类。


四、自定义自己的异常

1、”自己定义异常时,必须从已有的异常类来继承。”

2、”用户自定义的所有异常类都必须间接或直接的是Exception的子类。”

3、“

在程序中发现异常情况时,程序员可抛出一个异常实例,将其放到异常队列中去,并激活java的异常处理机制。

throw new MyException();




猜你喜欢

转载自blog.csdn.net/qq_41187714/article/details/80049521