码迷,mamicode.com
首页 > 其他好文 > 详细

异常的处理

时间:2019-05-26 11:17:33      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:col   日志   标识   main   参数   关系   str   特定   owa   

异常的处理

Java异常处理的五个关键字:try、catch、fifinally、throw、throws

抛出异常throw

在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。
在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?
throw关键字:
作用:
  • 可以使用throw关键字在指定的方法中抛出指定的异常
使用格式:
  • throw new 异常类名(参数); //参数:就是异常产生的原因
注意:
  1. throw 关键字必须写在方法的内部
  2. throw关键字后边new的对象必须是Exception或者Exception的子类
  3. throw关键字后边抛出指定的异常对象,我们必须处理这个异常对象。如果是这个异常对象是 RuntimeException 异常或其子类,我们可以不处理,默认交给JVM处理,如果是编译期异常,或者是其子类,我们必须处理,要么throws要么try-- catch
package demo02;

import java.util.Objects;

public class Demo01 {
    public static void main(String[] args) {
        int [] array = {1,2,3,4};
        int [] array1 = null;
        int i = method(array1, 1);
        System.out.println(i);

    }

    private static int method(int[] array,int index) {
        //判断此参数 是否为null
       Objects.requireNonNull(array);
        //判断 索引是否越界
        if (index<0||index >array.length-1){
            /*
        判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
        这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
            */
            throw new IndexOutOfBoundsException("索引越界异常");
        }
        return array[index];
    }
}

执行结果

Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:221)
    at demo02.Demo01.method(Demo01.java:16)
    at demo02.Demo01.main(Demo01.java:9)

异常处理的第一种方式:声明异常throws

声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
作用:
  • 当方法内部抛出异常的时候,那么我们就必须处理这个异常,可以使用throws关键字处理异常,会把异常对象声明抛出给方法的调用者(自己不处理,交给别人处理)最终交给JVM处理-->中断处理 
声明异常格式:
  修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{
      throw new 异常类名(参数);
      throw new 异常类名(参数);
 
    }
注意事项:
  • throws关键字必须写在方法声明处
  • throws关键字后面声明的异常必须是Exception或者Exception的子类
  • 若该方法抛出多种异常,那么在throws后面也要写多个异常类,用逗号隔开。如果抛出的多个异常有子父类关系,直接声明父类即可。
  • 调用了一个声明异常的方法,我们就必须处理异常,要么继续抛出throws 要么就是自己处理try--catch
package demo02;

import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo02 {
    // 调用了一个声明异常的方法,我们就必须处理异常,要么继续抛出throws 要么就是自己处理try--catch
    public static void main(String[] args) throws IOException {
        String s = "b.txt";
        method(s);
    }

    // 若该方法抛出多种异常,那么在throws后面也要写多个异常类,用逗号隔开。如果抛出的多个异常有子父类关系,直接声明父类即可。
    private static void method(String s) throws IOException {
        if (!s.endsWith(".txt")) {
            throw new IOException("文件后缀不对");
        }
        // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
        if (!"a.txt".equals(s)) {
            throw new FileNotFoundException("文件找不到异常");

        }
        System.out.println("后续代码");
    }
}

执行结果

Exception in thread "main" java.io.FileNotFoundException: 文件找不到异常
    at demo02.Demo02.method(Demo02.java:20)
    at demo02.Demo02.main(Demo02.java:10)

处理异常的第二种方式:捕获异常try…catch

如果异常出现的话,会立刻终止程序,所以我们得处理异常:
  • 要么该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
  • 要么在方法中使用try-catch的语句块来处理异常。
try-catch的方式就是捕获异常。
捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
捕获异常语法如下:
try{
  编写可能会出现异常的代码
  }catch(异常类型 e){
    处理异常的代码
  //记录日志/打印异常信息/继续抛出异常
  }
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
注意:
  • try和catch都不能单独使用,必须连用。
  • 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完catch中的代码,继续执行try...catch之后的代码
  • 如果try中产生了异常,那么就不会执行catch中的异常处理逻辑,执行完try中的代码,继续执行try...catch之后的代码
package demo02;

import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo02 {
    // 调用了一个声明异常的方法,我们就必须处理异常,要么继续抛出throws 要么就是自己处理try--catch
    public static void main(String[] args) {
        String s = "b.txt";
        try {
            //编写可能会出现异常的代码
            method(s);
        } catch (IOException e) {
            //处理异常的代码
            e.printStackTrace();
        }
        System.out.println("后续代码");
    }

    // 若该方法抛出多种异常,那么在throws后面也要写多个异常类,用逗号隔开。如果抛出的多个异常有子父类关系,直接声明父类即可。
    private static void method(String s) throws IOException {
        if (!s.endsWith(".txt")) {
            throw new IOException("文件后缀不对");
        }
        // 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
        if (!"a.txt".equals(s)) {
            throw new FileNotFoundException("文件找不到异常");

        }
        System.out.println("后续代码");
    }
}

执行结果

后续代码
java.io.FileNotFoundException: 文件找不到异常
    at demo02.Demo02.method(Demo02.java:27)
    at demo02.Demo02.main(Demo02.java:12)

如何获取异常信息:

Throwable类中定义了一些查看方法:
  • public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
  • public String toString() :获取异常的类型和异常描述信息(不用)。
  • public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台。
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace

finally 代码块

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
什么时候的代码必须最终执行?
  • 当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源。
finally的语法:
  • try...catch....finally:自身需要处理异常,最终还得关闭资源。
注意:finally不能单独使用。

异常的注意事项:

多个异常使用捕获又该如何处理呢?
  • 多个异常分别处理。
  • 多个异常一次捕获,多次处理。
  • 多个异常一次捕获一次处理。
一般我们是使用一次捕获多次处理方式,格式如下:
try{
  编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
  处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
  处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}

注意:

  • 这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
  • 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
  • 如果fifinally有return语句,永远返回fifinally中的结果,避免该情况.
  • 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
  • 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
 

 

异常的处理

标签:col   日志   标识   main   参数   关系   str   特定   owa   

原文地址:https://www.cnblogs.com/wurengen/p/10924968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!