• 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();
            }
        }
    }
    

  • 相关阅读:
    golang 实现生产者消费者模式(转)
    ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
    http 请求 Cros 跨域问题记录(转)
    问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    Git撤销本地commit(转)
    golang project 不显示文件夹 或者某个包明明能 import 但就是 import 不进来,提示Unresolved reference
    Qt6.2.4 qml 实现登录注册及显示详情demo
    Qt6.2.4 qml 实现文件选择与内容读取
    【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    【转载】AntvX6 流程图 demo 基于原生 js 支持导入与导出数据
  • 原文地址:https://www.cnblogs.com/zy200128/p/12902662.html
Copyright © 2020-2023  润新知