JAVA_异常

异常概念理解

程序执行过程中出现的不正常情况,虚拟机会将异常信息打印到控制台上,为了增强程序的健壮性

异常的存在形式

  1. 异常在java中以类的形式存在,每一个异常类都可以创建异常对象

异常发生的时间

  1. 都是发生在运行阶段
  2. 编译时异常是因为必须在编译阶段预先处理,否则会报错,所以叫编译时异常
  3. 异常是以类的形式存在,发生异常时都会new一个异常对象,只有在运行阶段才可以new对象

异常的分类

  1. 主要分为:错误,受控异常,非受控异常
  2. 错误:程序中出现了error,无法恢复,只能重新启动应用程序
  3. 受控异常:出现了这种异常必须处理,不处理的话程序无法编译通过,又称"编译时异常"
  4. 非受控异常:出现了这种异常可以不处理,例如一个数字被0除的异常,又称"运行时异常"

处理异常的手段

  1. 两种方式,分别是使用throws关键字,将异常抛给上级,另一种是使用try...catch语句进行捕捉
  2. 如果持续使用throws关键字进行上抛,最终会抛给main(),然后是JVM,此时程序会直接结束,所以建议在main方法中的异常使用try...catch进行捕捉

注意

  1. 出现编译时异常的时候,需要考虑采用哪种处理方式
  2. 不要在main()方法中使用上抛的处理方式
  3. 使用try...catch的时候,可以将异常信息打印出来
  4. throws可以抛出多个异常,用,隔开
  5. 使用throws时,如果程序发生异常,后续代码无法执行
  6. 使用try...catch时,如果程序发生异常,try语句快中,异常代码的后续代码无法执行,try...catch处理完之后,后续代码可以正常执行
java 复制代码
public class ExceptionTest01 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NumberFormatException nfe = new NumberFormatException("数字格式异常对象");
        System.out.println(nfe);
        // 调用doSome()方法
        // 如果没有在编译的时候处理,编译会报错
        //doSome();
        try {
            doSome();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    /*
    * 该方法使用了throws ClassNotFoundException
    * 表示
    * 1、该方法在执行的时候可能会抛出ClassNotFoundException异常
    * 2、ClassNotFoundException的父类是Exception,属于编译时异常,则在调用的时候需要手动处理
    * */
    public static void doSome() throws ClassNotFoundException{
        System.out.println("HelloWorld");
    }
}

异常对象常用的方法

  1. 获取异常简单的描述信息:String msg = exception.getMessage();
  2. 打印异常追踪的堆栈信息:exception.printStackTrace();
java 复制代码
public class ExceptionTest03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NullPointerException e = new NullPointerException("空指针异常");
        // 获取异常的简单信息
        String msg = e.getMessage();
        System.out.println(msg);
        // 打印异常堆栈信息,是采用异步线程的方式打印的
        e.printStackTrace();
        System.out.println("HelloWorld");
    }
}

java.lang.NullPointerException: 空指针异常
空指针异常
    at java_SE/com.javase.exception.ExceptionTest03.main(ExceptionTest03.java:9)
HelloWorld

finaly语句

  1. 必须要和try...catch语句一起联合使用
  2. finally子句中的代码是最后执行的,并且一定会执行
  3. 主要用于流的关闭,因为流在使用完之后是一定要关闭的,如果在try语句中关闭,如果出现了异常,异常后面的代码执行不了,有可能没有关闭流

自定义异常

java 复制代码
public class MyException extends Exception {
    public MyException() {
    
    }
    public MyException(String s) {
        super(s);
    }
}
java 复制代码
public class MyExceptionTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyException e = new MyException("用户名不能为空");
        e.printStackTrace();
        String msg = e.getMessage();
        System.out.println(msg);
    }
}
相关推荐
啊阿狸不会拉杆30 分钟前
《算法导论》第 27 章 - 多线程算法
java·jvm·c++·算法·图论
用户8029735654131 分钟前
【水平:编写简单的SpringCloud】用一篇文章精通SpringCloud-1
java
蔡俊锋42 分钟前
Javar如何用RabbitMQ订单超时处理
java·python·rabbitmq·ruby
天天摸鱼的java工程师1 小时前
Snowflake 雪花算法优缺点(Java老司机实战总结)
java·后端·面试
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
海梨花2 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
共享家95272 小时前
linux-高级IO(上)
java·linux·服务器
橘子郡1232 小时前
观察者模式和发布订阅模式对比,Java示例
java
指针满天飞2 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
Java技术小馆2 小时前
重构 Controller 的 7 个黄金法则
java·后端·面试