Java学习笔记之异常机制

1 错误 Error

  • Error 类对象由 Java 虚拟机生成并抛出,一般与代码编写者执行的操作无关
  • JVM 不再有执行操作所需要的内存资源时,JVM 一般会选择终止线程,抛出 OutOfMemoryError 错误
  • 诸如:类定义错误 NoClassDefFonudError 、链接错误 LinkageError

2 异常 Exception

  • Exception 类分支中有一个非常最重要的子类RuntimeException (运行时异常),常见的异常如下:
    • 数组下标越界 ArrayIndexOutOfBoundsException
    • 空指针异常 NullPointerException
    • 算术异常 ArithmeticException
    • 丢失资源 MissingResourceException
    • 找不到类 ClassNotFoundException
  • 异常一般由程序逻辑错误引起,程序应该从逻辑角度去尽量避免
  • 异常的捕获:从小到大取捕获异常
  • IDEA 异常捕获生成快捷键 Ctrl + Alt + T
public class main {
    public static void main(String[] args) {
        try {
            new main().a();
        }catch (StackOverflowError s){
            System.out.println("StackOverflowError");
        }catch (Exception e){
            System.out.println("Exception");
        }catch (Error e){
            System.out.println("Error");
        }catch (Throwable t){
            System.out.println("Throwable");
        }finally {
            System.out.println("finally");
        }
    }

    public void a(){
        b();
    }
    
    public void b(){
        a();
    }
}

//StackOverflowError
//finally
  • 主动抛出异常:在编写程序时,对于可能出现的异常,如果主动抛出异常,那么在遇到异常抛出后,程序不会停止运行
public class main {
    public static void main(String[] args) {
        int a = 2, b = 0;
        try {
            new main().test(a, b);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally");
        }
        
        System.out.println("我还能执行");
    }

    public void test(int a, int b) throws ArithmeticException{
        if (b == 0){
            throw new ArithmeticException();
        }
        System.out.println("a / b = " + a/b);
    }
}

/*
java.lang.ArithmeticException: / by zero
	at main.test(main.java:20)
	at main.main(main.java:6)
finally
我还能执行
*/

3 异常和错误区别

  • Error 一般是灾难性、致命的错误,是程序无法处理的,此时 JVM 会选择终止线程
  • Exception 一般情况下程序是可以处理的,应该在编写程序时就去处理这些潜在的异常

4 自定义异常

public class MyException extends Exception {
    
    private int detail;
    
    public MyException(int detail) {
        this.detail = detail;
    }

    @Override
    public String toString() {
        return "MyException{" + "detail=" + detail + '}';
    }
}

public class TestException {

    public static void main(String[] args) {
        int a = 20;
        try {
            new TestException().chose(a);
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally");
        }
    }

    public void chose(int a) throws MyException {
        if (a > 10){
            throw new MyException(a);
        }
        System.out.println("a = " + a);
    }
}


/*
MyException{detail=20}
	at TestException.chose(TestException.java:16)
	at TestException.main(TestException.java:6)
finally
*/
posted @   悟道九霄  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示