目录
异常的出现打破了c语言出现数组越界,空指针异常等问题,程序就直接异常中断。对程序出现异常进行捕获就可以继续执行,不会导致整个程序的崩溃。

🎈异常分为错误和异常两个大类,错误指的时JVM无法解决的严重问题,典型代表StackOverFlowError,OutOfMemoryError,一旦出现程序直接异常终止。异常分为受查异常(编译异常)和非受查异常(运行异常),共同继承于Exception类。
🪖异常处理分为两种,一种是对可能发生异常的程序进行判断,阻止异常的发生。第二种是发生异常后,对异常进行处理,这里详细分析第二种。
- public class Test15 {
- public static void main(String[] args) {
- try {
- int[] arr = {1, 2, 3, 4, 5, 6};
- System.out.println(arr[100]);
- arr = null;
- System.out.println(arr[0]);
- System.out.println(10 / 0);
- }catch (ArrayIndexOutOfBoundsException e) {
- e.printStackTrace();
- }catch (ArithmeticException e) {
- e.printStackTrace();
- }catch (NullPointerException e) {
- e.printStackTrace();
- }catch (Exception e) {
- e.printStackTrace();
- }finally {
- System.out.println("aaaaa");
- }
- System.out.println("bbbbb");
- }
- }

🤨try中可能发生数组越界,空指针异常,算数异常,程序由上往下执行,当发生数组越界异常后,程序会直接进入catch中进行捕获异常(不会在执行try中后面的代码),然后打印栈上的异常信息。如果没有捕获到异常,程序异常会由main方法交给JVM处理,这时候程序直接异常终止。由于受查异常和非受查异常都是继承于Exception类,所以把Exception放在最后进行捕获,这也是保底的一个做法,但是它不能放在第一个,否则后面的捕获则没有意义。异常一旦捕获程序将继续执行(可以清楚看见bbbbb被打印),否则异常会层层向上传递,如果都没有处理,最终交给JVM处理,程序直接异常中断。finally中的代码一定会被执行(在该方法结束前执行),就算异常没有捕获到也会被执行,一般用来对一些程序的关闭,清理扫尾工作等。
🧢上面代码都是程序出现异常后自动抛出,我们也可以手动抛出(throw关键字)。
- public class Test15 {
- public static void fun(int a) {
- try {
- if(a == 10) {
- throw new NullPointerException();
- }
- }catch (NullPointerException e) {
- e.printStackTrace();
- }
-
- }
- public static void main(String[] args) {
- fun(10);
- System.out.println("bbbbb");
- }
- }

🎉可以清楚看见手动抛出异常,被捕获后,程序继续执行。异常一旦抛出,就需要被捕获,如果fun中没有捕获到,其后代码将不会执行,在其被调用者main方法中继续捕获,如果还没有捕获到,就交给JVM处理,程序异常终止,抛出的异常最终都是需要处理的,不然就会导致交给JVM处理。
如果抛出的是运行时异常,不用自己处理。如果抛出编译时异常,就必须自己处理,要不声明异常,要不处理异常,否则程序无法进行编译。
😆利用throws关键字进行声明。
- public class Test15 {
- public static void fun(int a) throws Exception{
- if(a == 10) {
- throw new Exception();
- }
- System.out.println("aa");
-
- }
- public static void main(String[] args) {
- try {
- fun(10);
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("bbbbb");
- }
- }
🎄方法中抛出异常后,如果不想处理,利用throws对异常进行声明,调用该方法者必须对异常进行处理,或者继续throws声明。throws可一次声明多个异常,用逗号隔开。如果具有相同的父类,直接声明父类即可。声明异常必须是Exception或者Exception的子类,Exception默认是编译时异常。声明异常并没有对异常处理,最终还需要try catch()进行处理。
- class UserNameException extends RuntimeException {
- public UserNameException() {
- super();
- }
- public UserNameException(String message) {
- super(message);
- }
- }
- class PasswordException extends RuntimeException {
- public PasswordException() {
- super();
- }
- public PasswordException(String message) {
- super(message);
- }
- }
- class Logln {
- private String name = "aaaaa";
- private String password = "123456";
-
- public void fun(String name, String password) {
- try {
- if(!this.name.equals(name)) {
- throw new UserNameException("用户名错误");
- }
- if(!this.password.equals(password)) {
- throw new PasswordException("密码错误");
- }
- System.out.println("登录成功");
- }catch (UserNameException e) {
- e.printStackTrace();
- }catch (PasswordException e) {
- e.printStackTrace();
- }
- }
- }
- public class Test15 {
-
- public static void main(String[] args){
- Logln logln = new Logln();
- logln.fun("aaaaa","123");
- System.out.println("bbbb");
- }
- }

😉 可以自定义一个类,去继承Exception类(默认编译时异常),或者继承RuntimeException类(运行时异常)。其中实现无参和有参构造方法。当遇到异常,就可以抛出自己的异常,打印相应的信息。
🐵对可能存在异常的代码进行捕捉,对于整个程序来说,作用是相当大的,防患于未然。