欢迎光临
我们一直在努力

【Javase 常见异常问题 一篇文章告诉你】

一.Error和Exception的区别?

在Java中异常体系主要基于Throwable及其子类,Throwable主要有两个子类 Error 和 Exception

Error:表示运行环境的错误,错误是程序无法处理的严重问题,如虚拟机错误、动态连接库失效等。

Exception:表示程序本身可以处理的情况,分为两大类

  • 受检异常(编译时异常): 这种异常在编译时就必须处理(try-atch huo throws) 如:IOException、SQLException

  • 非受检异常(运行时异常) : 在运行时才抛出,编译不强制处理 如:NullPointerException、ArrayIndexOutOfBoundsException

  • 1.1 常见的Error 和 Exception有哪些?

    Error: StackOverflowError 栈溢出:无限递归、方法调用层级太深

    OutOfMemoryError (OOM) 内存溢出:堆内存不够

    NoClassDefFoundError 运行时找不到类(编译有,运行没)

    NoSuchMethodError 找不到方法(版本冲突最常见)

    LinkageError 类加载 / 链接失败

    VirtualMachineError 虚拟机本身异常

    Exception:

  • 运行时异常
  • NullPointerException (NPE) 空指针(最最最常见)

    IndexOutOfBoundsException 下标越界(数组、集合)

    IllegalArgumentException 参数不合法

    IllegalStateException 状态不合法

    ClassCastException 类型转换异常

    ArithmeticException 算术异常(除 0)

    ConcurrentModificationException 集合遍历时修改

    UnsupportedOperationException 不支持的操作

  • 编译时异常 IOException 文件 / IO 流异常(父类)
  • FileNotFoundException 文件找不到

    SQLException 数据库异常

    ClassNotFoundException 找不到类(和 NoClassDefFoundError 不同)

    InterruptedException 线程中断异常

    ParseException 格式化解析异常(日期、数字)

    二.throw 和 throws 的区别是什么?

  • throw :手动抛出一个异常对象
  • throws : 声明方法可能会抛出异常
  • 举例: throw:

    public void checkAge(int age) {
    if (age < 0) {
    // 手动抛出 一个 异常对象
    throw new IllegalArgumentException("年龄不能为负数");
    }
    }

    throws:

    // 方法声明:可能抛出 IOException 和 SQLException
    public void readFile() throws IOException, SQLException {
    // 方法内部可能出现异常
    FileReader fr = new FileReader("test.txt");
    }

    三.try-catch-finally的执行顺序

  • 正常执行顺序(无异常) 先执行 try 代码块 try 执行完 -> 执行 finally 代码块 finally 执行完 -> 方法继续往后走 catch 不执行

  • 出现异常的执行顺序 执行 try ,遇到异常立刻停止 try 后续diamagnetic 匹配对应catch 块并执行 catch 执行完 -> 执行 fianlly finally 执行完 -> 方法继续

  • 3.1 finally中的代码一定会被执行吗?

    答案是不一定

  • JVM直接退出
  • try {
    System.exit(0); // 退出虚拟机
    } finally {
    System.out.println("我不会执行!");
    }

  • 线程被强制杀死 在执行 finally 之前,线程被stop或操作系统杀死,finally 不执行

  • 死循环

  • try {
    while(true) { } // 死循环
    } finally {
    System.out.println("我永远等不到!");
    }

    3.2 finally 块中如果有 return 语句,会发生什么?

    结论:finally 里面写return,会直接覆盖太try/catch 里的return,并且”吃掉“异常 覆盖

    public static int test() {
    try {
    return 10;
    } finally {
    return 20;
    }
    }

    吃掉异常

    public static int test() {
    try {
    // 抛出异常
    throw new RuntimeException("出异常了");
    } finally {
    return 100;
    }
    }

    四.NoClassDefFoundError 和 ClassNotFoundException 的区别?

    ClassNotFoundExceptionException(异常):加载类时,找不到类文件→ 主动去加载,结果没找到

    NoClassDefFoundErrorError(错误):类存在,但加载失败了→ 编译时有,运行时找不到 / 加载失败

    赞(0)
    未经允许不得转载:171主机测评 » 【Javase 常见异常问题 一篇文章告诉你】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址