异常
Throwable
Throwable类是所有错误跟异常类的超类.
Exception
Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。
RuntimeException
RuntimeException类是运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。
特点:
方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常
运行时期异常一旦发生,需要程序人员修改源代码
Error
Error类是与Exception的平级的类,用来表示Java中存在的严重错误,只能通过修改代码来解决问题。
区别
Exception与Error区别:
Exception是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。
Error是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。
异常的产生
- 运行或编译时产生异常。
- 创建异常类的对象。
- 声明异常类。
- 将异常类对象传给调用者(main()方法)处理。
- 调用者无法处理,再将异常类对象传给jvm虚拟机。
- jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行。
抛出异常throw
在java中,提供了一个throw关键字,用来抛出一个指定的异常。
使用方法:
1.创建一个异常对象。封装一些提示信息
2.将这个异常告知调用者
使用格式:throw new 异常类名(参数);
声明异常throws
声明异常格式:
修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{
}
捕获异常try...catch...finally
捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
语句格式:
ry {
//需要被检测的语句。
}catch(异常类 变量) { //参数。
//异常的处理语句。
}finally {
//一定会被执行的语句。
}
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
捕获异常的组合方式
- try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。
- try catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。
- 一个try 多个catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
- try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
package learn.javase;
/**
* 异常的抛出(throw)与声明(throws)
* @author Jole
*
*/
public class ThrowsDemo {
public static void main(String[] args){
String[] str = {};
// System.out.println(throwT(null));
System.out.println(throwT2(null));
}
public static int throwT(String[] arr) throws NullPointerException{
if(arr==null) {
throw new NullPointerException("数组不能为空!");
}
int num = arr.length;
return num;
}
public static int throwT2(String[] arr){
int num =0;
try {
num = arr.length;
}catch(Exception e) {
System.out.println(e.toString());
}finally {
System.out.println("hhhhh");
}
return num;
}
}
自定义异常
package learn.javase;
/**
* 自定义异常,需集成RuntimeException运行时异常
* @author Jole
*
*/
public class TrcyTest {
public static void main(String[] args) {
getEx(1);
}
public static void getEx(int ... num){
for(int i : num) {
if(i==1) {
throw new TryDemoException("不能等于1");
}
}
}
}
自定义异常需要继承RuntimeException
package learn.javase;
/**
* 抛出异常 new 异常名称,继承RuntimeException运行时异常
* @author Jole
*
*/
public class TryDemoException extends RuntimeException{
public TryDemoException(String s) {
super(s);
}
}
子父类异常
子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。
package learn.javase; /** * 子夫类异常 * 1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。 * 2. 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。 * 3. 当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。 * @author Jole * */ public class ZifuException extends FuException{ //抛出父类一样的异常 public void method() throws RuntimeException { } //抛出父类子异常 public void method2() throws NullPointerException{ } }
父类:
package learn.javase; public class FuException { public void method () throws RuntimeException { } }
当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
package learn.javase; /** * 子类异常 * @author Jole * */ public class Zexception extends Fexception{ //抛出父类全部异常 public void method() throws NullPointerException, ClassCastException { } //抛出父类异常中的一部分 // public void method() throws NullPointerException{ // } //抛出父类异常中的一部分 // public void method() throws ClassCastException { // } }
父类异常:
package learn.javase; /** * 父类抛出多个异常 * @author Jole * */ public class Fexception { public void method () throws NullPointerException, ClassCastException{ } }
当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
package learn.javase; public class Zi extends Fu{ //错误的方式,会报错。 public void method() throws Exception { } }
父类:
package learn.javase; public class Fu { public void method (){ } }
评论 (0)