自定义异常,抛出异常

异常:
      在程序运行过程中,出现的不正常情况叫做异常
  注意:
      1.相同的代码在运行的时候,根据输入的参数或者操作的不同,有可能会发生异常,有可能不会发生异常,
          应该在写代码的过程中尽可能的保证代码的正确性,不要到处都是bug
      2.如果要解决代码中出现的异常,需要添加非常复杂的代码逻辑来进行判断,会使代码变得非常臃肿,不利于维护,
          可读性比较差,因此,推荐大家使用异常机制来处理程序运行过程中出现的问题。
      3.程序在运行过程中如果出现了问题,会导致后面的代码无法正常执行,而使用异常机制之后,可以对异常情况进行处理
          同时后续的代码会继续执行,不会中断整个程序
      4.在异常的处理过程中,不要只是简单的输出错误,要尽可能的将详细的异常信息进行输出
          e.printStackTrace():打印异常信息的最后一行开始追踪,寻找自己编写的Java类
异常的处理方式:
  1.捕获异常
    try{可能出现异常代码逻辑}catch(Exception e){异常处理逻辑}
    try{可能出现异常代码逻辑}catch(具体的异常Exception e){异常处理逻辑}catch(具体的异常);
        可以针对每一种具体的异常做相应的更丰富的处理
  注意:当使用多重的catch的时候一定要注意相关异常的顺序,将子类放在最前面的catch,父类放在后面的catch
      执行过程中可能存在的情况:
        1.正常执行,只执行try中的代码
        2.遇到异常情况,会处理try中异常代码之前的逻辑,后面的逻辑不会执行,最后会执行catch中的代码
        3.使用多重catch的时候,会遇到异常子类不匹配的情况,此时依然会报错,因此建议在catch的最后将所有的异常的父类写上

InputMismatchException 输入参数不匹配异常
ArithmeticException 数学异常
public class TestException {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入被除数:");
        try{
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d",
                    num1,num2,num1 / num2));
        }catch(ArithmeticException e){
            System.out.println("除数不能为0");
            //Throwable类里的getMessage方法
            System.out.println(e.getMessage());
            //跟踪堆栈信息
            e.printStackTrace();
            System.out.println("ArithmeticException");
        }catch(InputMismatchException e){
            e.printStackTrace();
            System.out.println("InputMismatchException");
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Exception");
        }
        System.out.println("感谢使用本程序!");
        System.out.println("这是红色字体,一般用来标识异常信息");

        try {
            FileInputStream fileInputStream = new FileInputStream(new File("D://e.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            Class.forName("com.tensent.helloWorld");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

       //如何把字符串类型转换成int类型
        String s = "123";
        int i = Integer.parseInt(s);
        System.out.println(i);
    }
}
java中只存在值转递
   自定义异常:在Java的api中提供了非常丰富的异常类,但是在某些情况下不太满足我们的需求,此时需要自定义异常
    步骤:
        1.继承Exception类
        2.自定义实现构造方法
        3.需要使用的时候,使用throw new 自定义异常的名称;
什么时候需要自定义异常?
        一般情况下不需要
        但是在公司要求明确,后者要求异常格式规范统一的时候是必须要自己实现的
 
在程序运行过程中,如果处理异常的部分包含finally的处理,那么无论代码是否发生异常,finally中的代码总会执行
   finally包含哪些处理逻辑
       1.I/O流的关闭操作一般放在finally中
       2.数据库连接的关闭操作一般放在finally中
public class FinallyDemo {
    public static void main(String[] args) {
        try{
            System.out.println(1 / 0);
            System.out.println("try中的语句");
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
            return;
        }finally{
            System.out.println("无论是否有异常finally语句块都会被执行!");
            return;
        }
        System.out.println("try...catch...finally...语句块后面的代码逻辑!");
    }
}

throws:声明异常
    在异常情况出现的时候,可以使用try...catch...finally的方式对异常进行处理,除此之外,可以将异常向外抛出,由外部的调用者进行处理
    1.在方法调用过程中,可以存在N多个方法之间的调用,此时假如每个方法中都包含了异常情况
        那么就需要在每个方法中都进行try...catch...另外一种比较简单的方式,就是在方法的最外层调用处理一次即可
        使用throws的方法,对所有执行过程中的所有方法出现的异常进行统一集中处理
    2.如何判断是使用throws还是使用try...catch...
        最稳妥的方法是在每个方法中都进行异常处理
        偷懒的方法是判断在整个调用的过程中,外层的调用方法是否有对异常的处理,如果有直接使用throws,如果没有
            那么就要使用try...catch...
 throws:声明异常,是声明异常是在声明方法的头部去写的,后面可以跟多个异常。
 throw:抛出异常,是在方法内部使用的,后面只能写一个异常
 NullPointerException:空指针异常
 
Error:错误
RuntimeException:运行时异常,是编译的时候出错的,我们是看不出来的
Checked:检查时异常,是编译不通过
main方法:只有JVM虚拟机能调用main方法
异常:Exception的顶级父类是Throwable老祖宗是Object
五个常见的运行时异常:ClassCastException (类转换异常)、IndexOutOfBoundsException (数组越界异常)、NullPointerException (空指针异常)、ArrayStoreException (数据存储异常,操作数组时类型不一致)、BufferOverflowException (还有IO操作的,缓冲溢出异常)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值