黑马程序员-异常

来源:互联网 发布:淘宝上卖零食怎么样 编辑:程序博客网 时间:2024/06/06 07:11

------- android培训、java培训、期待与您交流! ----------

异常,就是不正常,程序在运行时出现的不正常情况。

以万物皆对象的思想来想

这些问题也可以按照面向对象思想进行描述,并封装成了对象

所以异常就是java按照面向对象的思想将问题进行对象封装,这样就方便于操作问题以及处理问题


例如:角标越界,空指针,类型转换

这些问题进行不断向上抽取,得出了一个异常体系

java.lang.Throwable

Throwable:可抛出的

|--Error: 错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正

|--Exception 异常  可以有针对性的处理方式


这个体系有一个特点跟集合很像,就是以父类的名称作为子类的后缀名


这个体系所有的类和对象都具备一个独有的特点:可抛性

可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字操作


throws将出现的问题标示出来创建对象,交给调用者处理

throw 创建该异常对象


处理方式:

捕捉处理,抛出在调用处处理

对于捕捉:

try catch finally

基本格式 

try

{

需要被检测的代码

}

catch(异常类 变量名)

{

异常处理代码

}

finally

{

一定会执行的代码。

}

异常处理的机制

首先,try进行被检测代码的异常捕获,如果没有异常,则正常往下运行

如果有finally会在捕捉不到异常的前提下先执行,如果try语句中有return,先执行finally

如果捕捉到了异常,则创建一个相关异常的实例对象

在catch中定义的异常类 变量名 作为形参来将try捕捉到的异常对象传入

然后进行异常的处理,所以catch才是异常处理的最后手段

处理完后,不管是否继续执行,都将finally执行。finally是绝对会执行的,除非System.exit(0)

finally由于他的特性,一般用于关闭资源


catch的处理方式有几种常见的

一种 打印信息  因为每个异常对象的构造方法都会有一个私有的信息属性

所以可以调用公开的方法getMessage来获取这个信息

第二种:便是Exception复写的toString类了,这个类获取异常的名字以及异常的信息

第三种:e.printStackTrace 打印异常在堆栈中信息:异常名称+异常信息+异常位置


throw和throws的区别

throw用于抛出异常对象,后面跟的是异常对象,throw用在函数内

throws用于抛出异常类,后面跟的是异常类名,可以跟多个。抛出几个就处理几个


通常情况,如果函数内容有throw,抛出了异常对象,就需要进行处理,如果没有处理,就需要在本类上抛出这个异常,交给调用处去处理


有一个情况例外那就是RuntimeException的类及其子类

这一类实在运行时发生异常,直接将程序停止,方便调试。


那么编译时检查异常和运行异常的区别

编译被检查异常,能在函数内抛出,函数必须要声明异常,否则编译失败

运行时异常,直接抛出异常对象,无需声明无需处理,直接停掉程序


另外,当子类要处理异常时,特别是使用父类的方法,一定要看父类是否有抛出异常,如果没有,则子类必须进行try处理不能抛,如果父类又抛出异常

子类必须处理或者抛出。如果父类抛出了很多异常,那么子类可以抛出其父类的任意异常。但不能抛出父类所没有的异常


尽管如此,还是有很多异常是我们自己想要的,比如不想要负数之内的,这时就可以自定义异常。

如何自定义异常呢?

只要继承Exception或者RuntimeException即可,为了让类具有可抛性

然后在通过throw或者throws来操作


如果一个异常调用者处理不了,就可以把此异常转换成新的异常再抛出去。


try catch finally的结合方式

1.try catch finally

2.try catch

3.try finally


常见的异常:

1.角标越界异常(IndexOutOfBoundsException)

2.空指针异常(NullPointerException)

3.类型转换异常(ClassCaseException)


例子:

class Demo
{
public static void func() // throws Exception
{
try
{
throw new Exception();   // 没有catch解决,也没有抛出 , 编译失败
}
finally
{
System.out.println("B");
}
}
public static void main(String[] args)
{
try
{
func();
System.out.println("A"); // 发生异常,跳转。
}
catch (Exception e)
{
System.out.println("C");
}
System.out.println("D");
}
}

最后答案为BCD





0 0