java编译异常throws处理方式

将异常throws给jvm后,jvm默认处理:打印异常信息,并中断程序,这我是知道的。
那下面我自定义了一个编译异常,并在main方法中的if条件句抛出,编译器提示有编译异常;说明出现编译异常。
我main方法throws异常后,编译器提示正常了;处理方式是让jvm处理异常。
运行程序,程序正常运行,没有打印异常信息;那jvm也没处理啊。
jvm收没收到异常呢?还是说根本没异常?没有异常那我用的throws方法throws的谁呢?
收到的话应该直接打印呀,很困惑。
编译器判断是否有编译异常是怎样判断的呢?很迷惑这个过程


public class ExceptionTest {
    public static void main(String[] args) throws AgeException {
        int a = 1;
        if (a < 0) {
            //抛出一个编译异常
            throw new AgeException("有异常,打印信息");
        }
        System.out.println("没有异常,打印个g");
    }
}
//自定义AgeException编译异常,继承ioexception这个编译异常
class AgeException extends IOException {
    public AgeException(String s) {
        super(s);
    }
}

你不满足那个a<0,程序没抛异常
方法上那个throws AgeException是说你这个方法可能出现这种异常,但并不一定就会出现,你a现在不小于0,就不会触发那个throw new AgeException("有异常,打印信息");

你可以这么理解,就是你这个方法里在某种情况下抛出异常,在方法声明上throws,是告诉你的调用者,我这可能有异常,你想好怎么处理。
比如调用登录的方法吗,用户登录的时候,用户名不存在,在程序逻辑上就是一种异常,你就可以扔出去,但是用户名存在的时候它就不报异常。可是调用登录方法的人就得考虑,你出现异常后它怎么办。
一般我们开发企业项目的时候,会自定义异常,这个异常会有一个code和一个message,code就是状态码,前端会根据不同的状态码做不同的跳转或者提示。

你在方法上throws,是说我可能出现异常,这个异常我方法内部不处理,你们谁调用谁处理。然后方法里运行到throw new Exception的时候才会真的抛异常出去

因为 a = 1 所以 if (a < 0) 不会执行 throw ,所以你自定义的这个异常没有抛出啊。