zoukankan      html  css  js  c++  java
  • Java学习笔记 -异常

    异常概述

    • 异常在java中以类的形式存在,每一个异常类都可以创建异常对象
    • 当异常发生的时候,JVM就会创建对应的异常类对象,然后抛出异常

    java异常类的组织结构

    • Object: Throwable

    • Throwable: Error(错误) & Exception(异常)

      Error (JVM直接退出) : 
            例如 StackOverflowError          
      Exception (JVM可以继续运行) :
            ExceptionSubClass: Exception的直接子类、编译时异常或者受控异常;例如:文件打开 数据库链接
            RunTimeException:运行时异常或者非受控异常; 例如:NullPointerException   ClassCastException
      
    • 编译时异常:发生概率较高,一般可以预料异常的发生,所以在程序编写时必须要预先对其进行处理

    • 运行时异常:发生概率较低,一般难以预料其发生,编写程序处理代价较高,可适当编写程序处理

    异常的处理方法

    1.异常处理一:向上抛

    • throws 可以抛当前异常的父类
    • throws 后面可以跟多个异常,使用逗号隔开
    • 不建议在main方法上使用throws,因为这个这个异常会抛给JVM,如果产生了异常,那么程序就会终止
    • 使用throws的方式,出现异常之后,异常之后的代码不会执行,相当于return语句

    2.异常处理二:捕捉

    • 使用try..catch语句对异常进行捕捉

    • 在try语句中出现异常,try语句块中异常之后的代码也不会执行

    • catch语句的参数:从上到下必须遵循从小到大的原则,最好每一个catch精确处理每一类异常

    • 在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块出现了异常也会执行

    • 所以在诸如流、链接的关闭,在finally中写,不管异常是否出现,finally语句块中的代码都会执行。

    示例程序:

    public class ExceptionTest01 {
         public static void main(String[] args) {
            //第二种处理方式:捕捉
            try{
               doSome();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        
        //第一种处理方法:向上抛
        //ClassNotFoundException的直接父类是Exception,编译时异常
        public static void doSome() throws ClassNotFoundException{
            System.out.println("......");
        }
    }
    

    finally语句的使用:

    public class ExceptionTest04 {
        public static void main(String[] args) {
            FileInputStream fis = null;
            try {
                fis =new FileInputStream("D:\biangcheng");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                //在finally语句中关闭:无论try语句是否出现异常,close都能执行
                if(fis != null)
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    异常常用方法

    1.获取异常简单的描述信息:

    • String msg = exception.getMessage();

    2.打印异常追踪的堆栈信息:

    • exception.printStackTrace();

    示例程序:

    public class ExceptionTest03 {
        public static void main(String[] args) {
            //有参构造
            NullPointerException e = new NullPointerException("空指针异常!!!!!");
    
            //获取异常简单的描述信息
            String msg = e.getMessage();
            System.out.println(msg);
    
            //打印异常追踪的堆栈信息
            //java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的
            e.printStackTrace();
    
            System.out.println("Hello World!!");
    
            System.out.println("-----------------------------------");
            try {
                m1();
            } catch (FileNotFoundException e1) {
                //打印异常堆栈追踪信息。这行代码要写上,养成好习惯
                e1.printStackTrace();
            }
        }
    
        public static void m1() throws FileNotFoundException {
            new FileInputStream("D:\biancehng\java\Test.java");
        }
    }
    

    异常在实际开发中的使用 -自定义异常

    • 程序中一些错误发生的时候,不是采用输出错误信息的方式,而是更规范的选择抛出异常的方式
    • 语法:throw 异常对象;

    步骤:

    1.编写一个类继承Exception或者RuntimeException

    2.提供两个构造方法,一个无参数的,一个带有String参数的

    示例程序:

    public class MyStackException extends Exception{
        public MyStackException(){
    
        }
    
        public MyStackException(String s){
            super(s);
        }
    }
    
    public class Stack01 {
        private Object[] oArray;
        private int size;
        private int u;
    
        public Stack01() {
        }
    
        public Stack01(int size) {
            oArray = new Object[size];
            this.size = size;
            this.u = 0;
        }
        public void push (Object t) throws MyStackException{
            if(u == size){
                throw new MyStackException("栈满");
            }
            else{
                oArray[u++] = t;
            }
        }
        public Object pop() throws MyStackException{
            if(u == 0) {
                throw new MyStackException("栈空");
            }else
                return oArray[--u];
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Stack01 s1 = new Stack01(2);
            try {
                s1.push(12);
                s1.push(14);
                s1.push(33);
            } catch (MyStackException e) {
                e.printStackTrace();
            }
    
            try{
                System.out.println(s1.pop());
                System.out.println(s1.pop());
                System.out.println(s1.pop());
            } catch (MyStackException e){
                e.printStackTrace();
            }
        }
    }
    

  • 相关阅读:
    使用 Nginx 内置 $http_user_agent 来区分( 电脑 pc、手机 mobile、平板 pad )端的内容访问
    原创《开源一个用 vue 写的树层级组件 vue-ztree》
    原创《weex面向未来的架构》
    原创《如何用vue来轻松的驾驭 html5 webapp的页面体验》
    Pdf Convert Image 的解决方案
    原创《分享(Angular 和 Vue)按需加载的项目实践优化方案》
    .npmrc 实用小技巧
    使用Tampermonkey,实现Gitlab禁用自我Merge的功能
    vue 之 render 函数不能渲染非全局自定义函数-方案
    反射、注解和动态代理
  • 原文地址:https://www.cnblogs.com/zy200128/p/12902662.html
Copyright © 2011-2022 走看看