Throwable类
Throwable是所有异常的父类.而Throwable又有俩个直接子类:
1、Error:这个错误一般是JVM和硬件引发的问题,发生了这个错误,一般是不通过代码去处理问题的
2、Exception:称之为异常,异常是程序在编译、运行的时候出现的异常,用户可以对异常进行具体的处理,一般可以通过修改代码来处理异常.如果不去处理异常的话,程序将会停止运行.
只有当对象是Throwable类的子类类型的时候,该对象才能通过java虚拟机和throw语句抛出.
例子:
Throwable t1=new Throwable(); //创建一个Throwable类型的异常,括号内可以填写该异常的详细信息
Throwable类有些常用来显示异常信息的方法:
1、对象.getMessage();会返回该异常对象的详细信息字符串
2、对象.toString();当打印对象的时候会自动调用的方法,会返回该对象的父类和详细信息,
3、对象.printStackTrace();打印方法 这个是最常用的,会打印发生错误的代码行号,且异常信息会报红
异常和错误
程序异常是指程序在编译或运行期间发生了某种异常,需要处理异常,否则程序会结束运行(如数组索引越界等问题)
程序错误时程序在运行期间发生了某种错误(Error).通常没有具体的处理方式,程序会结束运行,一般都是系统级别的问题,用户一帮无法针对Error进行处理,只能修正代码.是JVM所在系统发生并反馈给JVM的.(如内存超出等问题)
捕获处理
用法:
// //捕获处理 // try { // //可能发生异常的代码 // } catch(异常类型 变量名){ // //发生异常后的处理 // }
如果不进行异常处理的话,一发生异常程序就停止了,如果想要当发生异常后继续执行catch之后的代码,就需要使用到异常捕获了.
我们可以将可能会发生异常的代码放入try语句中,发生异常后处理异常的语句放在catch语句中,而异常处理完想要执行的语句放在后面.
抛出处理
除了捕获处理,还有抛出处理,当方法内部不想处理异常,就可以进行抛出处理,让调用者来处理异常问题.
例子:
public static int demomo(int a,int b) throws Exception{//声明抛出异常的类型 if (b==0) { throw new Exception("除数为0"); //throw是用于方法内部用于抛出一个异常的,而throws是用于方法声明上的,说明抛出的异常类型 //而throw后面只能有一个异常对象,throws后面一次能够声明多个异常类型. } return a/b; } }
这个方法就进行了抛出异常,内部不进行处理,而进行抛出,让调用者自己处理异常.
异常分类
异常分为俩种:
1、运行时异常:是RuntimeException的子类,比如NullPointException(空指针异常)与ArrayIndexOutOfBoundException异常类型
当方法中抛出运行时异常时,方法定义中不需要throws声明抛出异常的类型,调用者不需要处理此异常,需要程序人员修改源代码.
2、非运行时异常:如果出现了非运行时异常就必须进行处理,也就是必须进行抛出处理或是捕获处理,否则编译器会报错.
运行时异常例子:
public static int demomo(int a,int b) {//当方法内抛出的是运行时异常的时候,方法声明 if (b==0) { //异常的分类 可以分成运行时异常和非运行时异常 非运行时异常出现时,必须先处理异常,否则不能运行,编译器会报错. //当方法抛出运行时异常的时候,方法定义中无须throws声明,调用者无须去处理此异常,运行时异常一旦发生,需要程序人员修改源代码 throw new ArithmeticException("除数为0");//这个异常类型就属于运行时异常,所以这个方法声明不用加throws来声明抛出异常类型 //throw是用于方法内部用于抛出一个异常的,而throws是用于方法声明上的,说明抛出的异常类型 //而throw后面只能有一个异常对象,throws后面一次能够声明多个异常类型. } return a/b; }
自定义异常
虽然java的jdk中定义了许许多多的异常类,但是有时候还是需要用到自定义异常类
java中所有异常类都是继承于Throwable,自定义类也一样,这样自定义类才能被throw抛出.
每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮用户进行异常信息的封装.
语法:
Class 异常名 extends Exception //继承RuntimeException 运行时异常 { public 异常名(){//无参构造方法 } public 异常名(String s){//有参构造方法,s为该异常的详细信息 super(s);//将详细信息传递给父类封装 } }
异常在重写之中的运用
1、子类覆盖父类的方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明异常.
2、当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集.
3、当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常.
4、父类中没有声明异常,而实现的子类覆盖方法发生了异常,无法进行throws声明,只能catch捕获处理,如果问题处理不了,catch中继续使用RuntimeException子类型的异常抛出.
课后习题1、异常与错误的区别是什么?
异常是程序在编译、运行期间发生的某种异常(Exception),若不处理异常,程序会结束运行
错误是程序在运行期间发生的某种错误(Error)、程序将会结束运行,Error错误发生往往都是系统级别的问题,是jvm所在系统发生并反馈给jvm的.
2、异常有哪几类别?
有俩种,分为运行时异常和非运行时异常.非运行时异常发生的时候,必须要进抛出或捕获处理,否则编辑器会报错,
而运行时异常,调用者不需要处理此异常,需要程序人员修改源代码.方法抛出运行时异常时.方法定义无须throws声明抛出异常类型
3、异常常用的有哪几种处理方式?
常用的有捕获处理和抛出处理