异常
异常的概念
- 指的是程序在执行的过程中,出现的非正常的情况,最后会导致JVM的非正常停止。
- 在java等面向对象的语言当中,异常本身是一个类,产生异常就是创建异常对象并且抛出一个异常对象。java处理异常的方式就是中断处理。
- 异常指的并不是编码错误,编码错误编译不会通过,也不会产生字节码文件,根本就不能运行。
- 异常的根类是Throwable,他有两个子类,分别是Exception和Error,我们常说的异常就是Exception。
- Exception产生之后程序员可以通过代码的方式纠正,使程序继续执行,是必须要处理的。Error是严重错误Error,只能通过实现避免,好比绝症。
异常的处理
throw关键字
可以使用throw关键字在指定的方法中抛出异常
格式:throw new …Exception(“异常的产生原因”)
注意:
throw关键字必须写在方法的内部
throw关键字后面new的对象必须要是Exception或者Exception的子类对象
throw关键字抛出指定的异常对象,我们就必须要处理这个异常对象,如果throw关键字后面new的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,交给JVM处理。如果throw关键字后面跟着的是编译异常(写代码的时候报错),那么我们就必须处理这个异常,要么throws,要么try…catch
public class Exceptions1 {public static void main(String[] args) {test(null);}public static void test(Object obj){if(obj==null)throw new NullPointerException("空指针异常");} }
throws关键字
可以使用throws关键字在方法 声明处
格式:修饰符 返回值 方法名(参数列表)throws AAAException,BBBException{ throw new AAAException(“产生原因”); throw new BBBException(“产生原因”); }
throws关键字后边声明的异常必须是Exception或者Exception的子类
如果方法内部抛出了多种异常,那么方法声明处也必须要声明多种异常,但是如果某个异常是某个异常的父类,那么只需要声明父类即可。
抛出异常之后,要么我们一路在方法的声明处throws,最后让JVm帮我们处理,要么就是使用try…catch捕获异常并且处理异常。
可以写多个catch捕获多个异常,而仅仅写一个try和一个finally,但是需要注意的是,如果catch里面捕获的异常存在子父类的关系,那么子类必须捕获在父类之前,因为如果把父类写在前面,那么子类异常就不可能被捕获到。
public class Exceptions1 {public static void main(String[] args) throws NullPointerException{test1(null);}public static void test1(Object obj) throws NullPointerException{if (obj==null)throw new NullPointerException("空指针异常");}
public class Exceptions1 {public static void main(String[] args) {try {test1(null);}catch(NullPointerException e){System.out.println(e);}}public static void test1(Object obj) throws NullPointerException{if (obj==null)throw new NullPointerException("空指针异常");}
finally
格式:
try{}catch(Exception e) {} finlly{//无论是否存在异常,finally里面的代码都会执行 }
无论catch有没有捕获到异常,finally里面的代码都会执行。
自定义异常类
java提供的异常类不满足我们的使用,我们需要自己定义一些异常类
格式:
public class ...Exception extends Exception|RuntimeException {//添加一个空参数的构造方法//添加一个带异常信息的构造方法 }
自定义异常一般以Exception结尾
必须继承自Exception或者RuntimeException类,如果继承自Exception类,那么就是一个编译器异常,如果方法内抛出了异常,我们就需要处理这个异常,要么throws,要么try…catch;而RuntimeException是一个运行期异常,我们不需要自己处理,只需要交给JVM虚拟机处理即可。
public class registerException extends Exception{public registerException() {}public registerException(String s) {super(s);} }
异常练习
//registerException public class registerException extends Exception{public registerException() {}public registerException(String s) {super(s);} }//注册类 import java.util.Scanner;public class Exceptions1 {static String[] arr={"zs","ls","ww"};public static void main(String[] args) throws registerException {Scanner sc=new Scanner(System.in);String s=sc.next();test3(s);}public static void test3(String username) throws registerException{for (String ar : arr) {if(ar.equals(username)){throw new registerException("重复注册");}}throw new registerException("注册成功");} }