• 新手异常入门


    异常

    • 程序不正常的执行,报错。Exception

    • 异常有父类:ThrowableThrowable又有子类ErrorException

    • 异常的分类:

    • Throwable:为以下错误的父类。

      • Error(错误一般比异常严重,一般为虚拟机出现错误)Error类型的错误必须抛出解决不能捕获!

      • Exception

        • RuntimeException(运行时异常):编译通过,不强制处理,在程序运行时出现→ 不受检查异常。

          • 算术异常、数组下标越界、空指针异常、

        • 编译期异常(除了RuntimeException其余都是编译期异常):必须处理,要么捕获,要么抛出。一般是语法错误,在进行编译时就会报错→ 受检查异常.必须及时处理!

    • 常见异常

      • Error:内存溢出错误(两个方法之间递归调用);

    • 异常的处理

      • 不管是错误Error还是异常Exception都是需要被处理。处理异常有两种方式:

        • 抛出throws 和捕获try catch

    • throws:用法:在方法声明后 即方法参数列表后,左大括号({)前用throws声明要抛出的异常。throws 异常类名,支持同时抛出多个异常,也就是 throws 异常类名1,[异常类名2]….如果方法有多个异常需要抛出,可以使用最大异常父类声明(Exception)直接抛出Exception;

    • 异常的注意事项以及如何使用异常处理:

      • 有异常的方法怎么使用:

        • 1)方法内部的异常有try catch处理时:该方法可以被正常调用。

        • 2)方法声明上有异常抛出时(throws):调用该方法时必须对该方法处理。

        • 如果方法声明上有异常抛出,重写时应该注意

          • 子类重写有异常方法的时候,子类的方法抛出的异常范围要比父类范围小,要么范围相等、要么没有异常。

          • 作用在于:声明该方法/编译或运行时可能抛出的异常种类。只要方法中有异常,不管是运行异常,还是编译异常,程序就会在该处停止,并抛出异常。

    • 注意事项:运行时异常,可以明确的在方法声明上声明要抛出的运行时异常,也可以不声明。编译期异常必须处理。要么抛出(throws)要么捕获(try catch)

    • 异常的本质:程序运行抛出的异常,其实是方法声明的异常类的对象。

    • throw

      • 在方法体中,可以明确显示抛出哪种异常。可以准确地控制在什么地方抛除异常。

      • 语法:throw 异常对象(匿名对象的形式 new 异常类名()),如果throw后面抛出的异常对象是运行时异常,那么可以在方法声明上声明要抛出的异常,也可以不声明。如果throw抛出的是编译期异常对象,必须强制处理该异常(声明抛出或者捕获)

    • throwthrows异同

    • 1)位置不同:throw在方法体中,throws是在方法声明上。

    • 2)作用不同:throw后是声明抛除的异常对象,throws后声明的是异常类类名。

    • 3)写法不同:throw后只能写一个异常,throws后可以写多个对象名。

    • try catch

      • 异常的另外一种处理方式,叫做捕获异常,在上线的项目中运用广泛,因为显示抛出异常,程序就会在异常处停止,就会影响程序功能,但是捕获异常可以做到即使有异常但是程序还会继续执行。捕获异常后一般可以将异常做成异常日志,把捕获的异常统一记录,后续再进行修改。

      • Try catch可以捕获异常让程序正常执行,但是try{}中的代码,如果有异常的话,try中报错后的代码不执行,如图:

      • 语法:

         

        • try{

          可能出现异常的代码

          }catch(要捕获的异常类名 对象名){

          捕获之后干的事情。

          }[catch(要捕获的异常类名2 对象名2){

              捕获后干的事情。

              }]

    • 如果try中抛出的异常不是catct后面要捕获的异常,就会继续抛出异常,程序就会停下。

    • 如果try中可能抛出多个异常,可以写多个catch 同时捕获多个异常.但是写多个catch麻烦,可以直接捕获最大的异常Exception。在捕获Exception异常后,就不能再写捕获其子类异常,因为上一个Exception异常已经基本捕获全部异常

    publicstaticvoid main(String[] args) {

    try {

    //可能出现异常的代码

    System.out.println(1/0);

    }catch(ArithmeticException ari){

    System.out.println(ari);

    System.out.println(ari.getMessage());//打印异常信息/将异常信息写入日志

    //打印错误信息

    ari.printStackTrace();

    //获取主要原因,框架中会经常见CasuseCause在写项目的时候经常用到,报错会非常详细

    Throwable Masg = ari.getCause();

    System.out.println(Masg);

    }//finally{}最终都要执行到的,可写可不写

    }

    • 自定义异常

    • 1)创建自定义异常类

    • 2)继承异常类(ExceptionRuntimeExceptionThrowable(是最大的抛出异常类,其下面是Exception)继承哪个将拥有那个的特性。例如继承RuntimeException及其子类就有运行时异常的特点。

    • 3)写带(String)参数的构造方法用于将异常信息通过super(messags)传递给父类.

      • throw抛出异常程序会直接停止,所以建议用try捕获异常,但是捕获异常的时候由于自定义异常中并没有定义类似除数为0、下标越界等自动抛出异常的方法,所以需要捕获自己抛出的异常类似于:

        在此set方法被调用的时候,会进行如下的异常捕捉

        publicvoid setAge(intage) {

        if(age >150) {

        try {

        //如果年龄大于150,执行下面的一句话,一定会抛出异常

        thrownew AgeGT150Exception("");

        //捕获 AgeGt150Exception类的异常

        }catch(AgeGT150Exception ag) {

        //捕获到后的操作

        ag = new AgeGT150Exception("年级大于150");

        System.out.println(ag);

        }

        }elseif(age < 0) {

        try {

        thrownew AgeLT0Exception("");

        }catch(AgeLT0Exception ag) {

        ag = new AgeLT0Exception("年龄小于0");

        System.out.println(ag);

        }

        }else {

        this.age = age;

        }

        }


        //异常类

        publicclassAgeGT150Exceptionextends RuntimeException{

        public AgeGT150Exception(String massge) {

        super(massge);

        }

        }

    我会慢慢更新一下Java 的学习知识,在我所写的内容中有不懂的可以直接私信我。
  • 相关阅读:
    我的浏览器大战
    使用Jmeter进行HTTP接口测试
    Jmeter连接SqlServer数据库进行压力测试
    java通过JDBC链接SQLServer2012 (含1433端口打通)
    读程序写结果技巧【半转】
    book118免费下载文档方法【转】
    PJ可能会用到的动态规划选讲-学习笔记
    PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
    PJ可能会考的模拟与枚举-自学教程
    TG可能会用到的动态规划-简易自学
  • 原文地址:https://www.cnblogs.com/interflow/p/11233210.html
Copyright © 2020-2023  润新知