• 异常及处理


    异常的分类

    捕获异常

    抛出异常

    自定义异常


    概述:

      Java中的异常(Exception)又称为例外,是在一个程序执行期间发生的时间,他中断正在执行程序的正常指令流

    1-1  异常的分类

      Throwable类是Java语言中所有错误或异类的超类,这意味着只要是错误或者异常,那么肯定是Throwable子类的实例,但事实上,由于错误,异常内容过于庞大,所以设计人员将他分开来,这就是Throwable的两个子类,Error和Excretion

      Error类负责错误,他指程序运行的时候遇到的硬件或操作系统的错误,比如:内存溢出,堆栈溢出,动态链接错误,虚拟机jvm错误,这些错误都是致命的是依靠程序自身无法解决的

      Excetion是运行时错误,他是可以被捕获的。

     常见的异常:

     2-1  捕获异常 

      Java异常处理通过5个关键字控制:try,catch,throw,throws和finally;

      捕获异常使用:try ..catch语句,把可能发生异常的代码放在try{..}中,然后使用catch捕获对应的Excetion及其子类;

    import java.util.InputMismatchException;
    import java.util.Scanner;
    /*
     * try...catch...catch
     * 多个异常体现
     *
     */
    public class ExcetionTest01 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            try {
            System.out.println("请输入你的被除数:");
            int num1 = sc.nextInt();
            System.out.println("请输入你的除数:");
            int num2 = sc.nextInt();
            int sum = num1 / num2;
            System.out.println("商等于:" + sum);
            }catch (InputMismatchException e) {
                System.out.println("输入非法");
                //e.printStackTrace();//打印错误信息
            }catch(ArithmeticException e) {
                System.out.println("除数不能为0");
            }finally {
                if(sc != null) {
                    sc.close();
                }
            }
        }
    }
    System.out.println("-----------------------")
        import java.util.InputMismatchException;
    import java.util.Scanner;
    /*
     * try...catch...catch
     * 多个异常体现
     *
     */
    public class ExcetionTest02 {
        public static void main(String[] args) {
            Scanner sc = null;
        
            try {        
                try {
                    while(true) {
                     sc = new Scanner(System.in);
                    System.out.println("请输入你的被除数:");
                    int num1 = sc.nextInt();
                    System.out.println("请输入你的除数:");
                    int num2 = sc.nextInt();
                    int sum = num1 / num2;
                    System.out.println("商等于:" + sum);
                    }
                    }catch (InputMismatchException e) {
                        System.out.println("输入非法");
                        //e.printStackTrace();//打印错误信息
                    }
                }catch(ArithmeticException e) {
                        System.out.println("除数不能为0");
                    }finally {
                        if(sc != null) {
                            sc.close();
                        }
                    }
                
        }
    }

      捕获异常关键字:

        finally

        有些时候,try块内引用了一些物理资源,例如数据库连接,网络连接或磁盘文件等。那么一旦try块内出现了异常,这些资源将无法保证可以释放。这个时候必须有一种可以明确保证资源一定得到解放的操作,不管是否存在异常,这就是finally存在的原因(不如如何,fainlly一定会执行!)

    3-1  抛出异常

      在Java系统中,我们不仅可以使用try...catch来捕捉异常,还可以使用throw语句来显示的引发异常,执行的代码一旦遇到throw语句,就会立即停止,不会继续执行

    import java.io.IOException;
    
    public class ThrowTest {
        public static void main(String[] args) {
            //这是比较负责任的行为
            try {
                method1();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static void method1() throws IOException {
            method2();//抛出异常
        }
        public static void method2() throws IOException{
            System.out.println("这是正常执行的代码");
            //人为的抛出一个异常
            throw new IOException("这是我新建的一个IO异常");
        }
    }

      throw和throws的区别

      throw引发异常,显示的抛出一个异常,一般在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出特定类型的异常

      throws是方法可能抛出异常的声明,用在声明方法时,表示该方法可能抛出异常,然后交给上层调用他的方法处理

      区别:

        throw出现在方法体,throws出现在方法头

        throws是抛出了异常,执行throw则表示一定是抛出了某种类型的异常,throws是表示出现异常的一种可能性,并不一定会抛出这些异常。

    4-1  自定义异常

      当我们在代码中需要抛出异常时,尽量使用jdk已定义的异常类型,在一些大型项目中可能需要自定义新的异常类型,但是保持一个合理的议程继承体系是非常重要的

      一个常见的做法是自定义一个BaseExcetion作为根异常,然后派生出各种业务类型的异常

      BaseExcetion需要从一个适合的Excetion派生,通常建议从RuntimeExcetion派生

      格式: 

        public class BaseExcetion extends RuntimeExcetion{

        }

    public class Test {
        public static void main(String[] args) {
            System.out.println("这是测试我们自定义异常的:");
            method1();
        }
        public static void method1() {
            System.out.println("这是测试我们自定义异常的:");
            throw new UserNotFountExcetionTest("这是我们找不到用户的异常"); 
        }
    }
    -----------------
    
    public class UserNotFountExcetionTest extends BaseExcetionTest {
        public UserNotFountExcetionTest(){
            super();    
        }
        public UserNotFountExcetionTest(String message) {
            super(message);
        }
        public UserNotFountExcetionTest(Throwable able) {
            super(able);
        }
        public UserNotFountExcetionTest (String message,Throwable able) {
            super(message,able);
        }
        
    }
    ------------------------
    /**
     * 这是我们新建的一个项目的根异常
     * @author Lenovo
     *
     */
    public class BaseExcetionTest extends RuntimeException {
        //构造器
        public BaseExcetionTest(){
            super();    
        }
        public BaseExcetionTest(String message) {
            super(message);
        }
        public BaseExcetionTest(Throwable able) {
            super(able);
        }
        public BaseExcetionTest (String message,Throwable able) {
            super(message,able);
        }
    }
  • 相关阅读:
    C++的常量折叠(一)
    如何写面向互联网公司的求职简历
    所有的程序员都是自学成才
    [一个经典的多线程同步问题]解决方案一:关键段CS
    [一个经典的多线程同步问题]问题引入
    多线程笔记--原子操作Interlocked系列函数
    【分治法】归并分类
    内存字节对齐一网打尽,再也不纠结
    在C语言中基本数据类型所占的字节数
    多线程笔记--先了解工具
  • 原文地址:https://www.cnblogs.com/wyk1/p/14428036.html
Copyright © 2020-2023  润新知