闭关修炼100天 JavaEE乱杀 第18天

闭关修炼100天 JavaEE乱杀 第18天

写在前面:

我始终在想到底该怎么学好编程,毕竟这大概率是我未来的经济来源,在集合那个地方,我反复地觉得只会使用是不行的,一个程序员最大的悲哀就是只会使用别人开发出来的工具,而并没有自己的不可替代性,我要以此为生,所以我得竭尽全力将其学会,学懂,学深。一起加油把,共勉。

Error出现的情况

​ 错误(Error):JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的责任
​ 这一类异常事件无法恢复或不可能捕获,将导致应用程序中断
​ @param args

//第一种情况
public static void main(String[] args) {
    //StackOverflowError - 栈内存溢出的错误
    //由于调用方法要在栈中开辟空间,一直调用method(),导致栈内存溢出
    method();
}

private static void method() {
    method();
}
//第二种情况
public static void main(String[] args) {
    //这里并不会报内存溢出的错误,因为垃圾回收机制
    //byte[] bytes只会在栈中创建一次,new出下一个byte数组对象时,把它的地址给bytes,上一个byte数组就没有引用了,所以被回收掉
    while (true){
        byte[] bytes = new byte[2024];
    }

    //OutOfMemoryError - 内存溢出的错误
    //由于把之前new出来的对象存在集合list中,所以导致内存溢出的错误
    ArrayList<byte[]> list = new ArrayList<>();
    while (true){
        byte[] bs = new byte[2024];
        list.add(bs);
    }

}

Exception出现的情况

异常(exception):其他因编程错误或偶然外在因素导致的一般性问题。
这类异常得到恰当的处理时,程序有机会恢复至正常运行状况

RuntimeException - 运行时异常/非受检性异常

RuntimeException - 运行时异常/非受检性异常:那些程序员编写程序时应该避免的异常(逻辑异常)

第一种情况
public static void main(String[] args) {
    
    //ArithmeticException - 算数异常
    System.out.println(10/0);
}
//第二种情况
public static void main(String[] args) {

    //NullPointException - 空指针异常
    method(null);

}

private static void method() {

    System.out.println(str.length);
}
//第三种情况
public static void main(String[] args) {

    //ClassCastException - 类型转换异常
    Object obj = new Integer(100);
    Double d = (Double) obj;
    System.out.println(d);
}
//第四种情况
public static void main(String[] args) {

    //ArrayindexOutOfBoundsException - 数组下标越界异常
    int[] arr = {1,2,3};
    System.out.println(arr[10]);

}
//第五种情况
public static void main(String[] args) {

    //OutOfBoundsException - 下标越界异常
    ArrayList<Object> list = new ArrayList<>();
    System.out.println(list.get(100));
}

一般性异常 - 受检异常

一般性异常 - 受检异常:编译器要求必须处置的异常。指的是程序在运行时由于外界因素造成的一般性异常。

public static void main(String[] args) throws ParseException {
    //ParseException - 解析异常
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    Date date = sdf.parse("2024-5-17");
    System.out.println(date);
}

异常处理机制

​ 1.java程序在执行过程中如果出现异常,会自动生成一个异常类对象,
​ 该异常对象将自动提交给JVM,这个过程称为抛出(throw)异常
​ 2.当JVM接收到异常对象时,会寻找能处理这一异常的代码
​ 2.1 找到了 - 把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
​ 2.2 没找到 - 运行时系统将终止,相应的java程序也将退出

异常的处理能力

​ 1.try…catch…
​ 2.throws
​ 3.throw

try…catch…

​ 语法格式:
​ try{
​ …可能发生异常的代码…
​ }catch(异常类型 e){
​ …处理异常…
​ }finally{
​ …不管是否发生异常,都会执行的代码…
​ 经验:一般把关闭资源的代码写在此处
​ }
​ 场景:处理一个异常的情况

public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        System.out.println("请输入第一个数字");
        int a = scan.nextInt();
        System.out.println("请输入第二个数字");
        int b = scan.nextInt();

        try{
            System.out.println("111");
            System.out.println(a/b);
            System.out.println("222");
        }catch (ArithmeticException e){
            System.out.println("处理算数异常...");
        }finally {
            scan.close();
        }
        System.out.println("333");
}
 /* 请输入第一个数字
	10
    请输入第二个数字
	2
    111
    5
    222
    333*/

 /* 请输入第一个数字
    10
    请输入第二个数字
    0
    111
    处理算数异常...
    333*/
//由此可以看出代码运行的逻辑从上往下,看try中发不发生异常,没发生,按顺序执行,不进入catch,但会进入finally中的代码块;如果try中发送异常,就看是不是catch中的类型,不是直接报错,是的话,执行catch中的语句,再执行finally中的语句,再按顺序执行下去,这也是222并没有打印的原因
public static void main(String[] args) {

        String[] names = {"aa","bb","cc","ee"};

        Scanner scan = new Scanner(System.in);

        System.out.println("请输入第一个数字");
        int a = scan.nextInt();
        System.out.println("请输入第二个数字");
        int b = scan.nextInt();
        System.out.println("请输入需要获取元素的下标(0~3) : ");
        int index = scan.nextInt();

        try{
            System.out.println("111");
            System.out.println(a/b);
            System.out.println("222");
            System.out.println(names[index]);
            System.out.println("333");
        }catch (ArithmeticException | ArrayIndexOutOfBoundsException e){//这里只能是|,不能写||,会报错
            System.out.println("处理异常...");
        }catch (Exception e){
            //先常类型范围要小于后捕获的异常类型
            //经验:通常我们不会去catch运行时异常,直接让系统报错,再修改,一般catch捕获一般性异常
        } finally {
            scan.close();
        }
        System.out.println("444");
    }

}
//一般性异常的try...catch...
public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date date;
        try {
            date = sdf.parse("2024-5-17");
        } catch (ParseException e) {
            System.out.println("年月日输入格式错误");
        }//ParseException 解析异常
}

throws

public static void main(String[] args) throws ParseException {
        
    try {
        method1();
    }catch (ParseException e){
        System.out.println("解析异常");
    }
}

private static void method1() throws ParseException {
    method2();
}

private static void method2() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    Date date = sdf.parse("2024-5-17");
    System.out.println(date);
}

throw

public class Demo1 {
    /**
     *知识点:处理异常 -- throws(抛出异常)
     */
    public static void main(String[] args){10
        Scanner scan = new Scanner(System.in);

        System.out.println("请输入第一个数字: ");
        int a = scan.nextInt();
        System.out.println("请输入第二个数字: ");
        int b = scan.nextInt();

        try {
            method(b);
        }catch (MyException e) {
            b = 1;
        }

        System.out.println(a/b);

        scan.close();
    }

    private static void method(int num) throws MyException {
        if(num == 0){
            throw new MyException();
        }
    }
}




//另一个类
public class MyException extends Exception{
    @Override
    public String toString() {
        return "除数不能为0的异常";
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值