------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
异常的概述:
异常;程序中,在运行的时候出现不正常的现象。java是面向对象的语言,异常也是一种对象
因此每次出现异常的时候,异常就会告诉你发生是什么事情。
异常基础体系:
java.lang.Throwable类,所有异常和错误的父类
Error类
所有错误的父类
Exception类
所有异常的父类
RuntimeException
NullPointerException
ClassCastException
IndexOutOfBoundsException
错误,比较严重的问题,一旦出现了错误,程序根本不能运行,必须修改源代码。
异常,比较轻微的问题,一旦出现了异常,程序可以处理掉异常,继续运行
构造方法 空参数
构造方法 Throwable(String message)异常信息
? String getMessage()返回异常信息的详细字符串
? String toString()返回异常信息的简短描述
? void printStackTrace()将异常信息直接输出在控制台
异常的第一种处理方法:
try catch 代码块处理
标准格式:
try{
被检测的代码,可能出现异常的代码
}catch(异常类 变量){
异常的处理方式
变量.调用Throwable类的三个方法
异常的第二种处理方式抛出异常:
如果程序运行的时候,由于用户或者调用非法传递参数,导致程序出现问题,假如调用者真的传递了非法的数据,
需要手动抛出异常。在方法中,使用关键字throw 写异常对象,new 出来的.
错误: 未报告的异常错误Exception;程序中,有异常没有处理
方法内部抛出异常,不处理这个异常,交给调用者处理,谁调用我这个函数,谁处理这个异常。必须在方法的声明上,声明出来,我这个方法有异常,谁调用谁处理。
在方法的定义上,使用throws关键字,把异常声明出来,告诉调用者,如果你调用处理我的异常 throws 异常类
? throw : 只能写在方法内部,后面必须写 new 异常()
? throws: 只能写在方法声明上,后面必须写 异常类
编译时期异常和运行时期异常:
编译时期异常:调用了一个抛出异常的方法,不处理,编译失败
运行时期异常:RuntimeException类,和他所有的子类都属于运行时期异常
特点:如果方法内部用throw 抛出的是一个运行时期异常,此时方法声明上,不需要使用throws声明异常,
调用者不需要处理这个异常,Java工程师们设计运行时异常的初衷,运行时期异常一旦发生,程序必须停下来修改源代码,运行时期异常,是不能发生的
Person p = new Person();
p.show();
p =null;
p.show();空指针异常
int[] arr = {1,2,3};
arr[10] = 100;
if(arr[50] < arr[90])
数组越界,字符串越界,空指针异常,类型转换异常
自定义的异常:
Java原有异常体系中,很多的现象进行异常的封装,越界,类型转换,JDK中也有想不到的异常,所以自定义异常
第一步,入伙 继承 Exception 或者继承RuntimeException
第二步,传递异常信息,将异常信息传递给Exception的构造方法
注意:异常必须是Exception或者RuntimeException的子类,具备可抛性
finally代码块:
try{} catch(Exception e){} finally{}
try{} finally{}
finally代码块中的程序,必须要执行,不管程序有没有异常方法,finally中的程序必须执行
finally代码块,一般用于释放资源使用
例举代码:
/*
finally代码块
*/
class ExceptionDemo4
{
public static void main(String[] args)
{
try{
method(10);
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("必须执行");
}
}
public static void method(int x)throws Exception{
if (x == 0)
throw new Exception();
else
System.out.println("=========");
}
}
子类继承父类后的异常细节:
子类继承后,重写父类的方法;
? 父类的方法不抛出异常,子类的方法不能抛出异常。如果子类的重写方法,调用了一个抛出异常的方法,子类只能try catch处理异常
? 如果父类的方法,抛出异常,子类的方法可抛可不抛,但是如果子类抛异常,抛出的异常不能大于父类方法抛出的异常
? 方法中可以不可以,抛出多个异常,每个异常需要在方法声明上throws声明出来,调用者写多个catch处理
? 多catch处理异常过程中,注意,最高的异常父类,写在最后面
例举代码:
/*
子类父类中的异常处理
*/
class AException extends Exception
{
}
class BException extends AException
{
}
class CException extends Exception
{
}
class Fu
{
public void abc()throws Exception{}
}
class Zi extends Fu
{
public void abc()throws Exception{
}
public void method(int x)throws CException,AException{
if(x==0)
throw new AException();
else
throw new CException();
}
}
class ExceptionDemo6
{
public static void main(String[] args)
{
Zi z = new Zi();
try{
z.method(1);
}
catch(Exception e){}
}
}
没有学不好,只有不努力~~——至自己!!!