异常

目录

处理异常的方式

throw抛出异常对象

throw和throws区别

自定义异常

异常的分类


 

处理异常的方式

  • try.......catch....finally
  • try......finally。 
  • try......catch
public class ExceptionDemo2 {

    public static void show(){
        try{
            int a = 1/0;
        }catch (Exception e){
            System.exit(1);
        }finally {
            System.out.println("finally");
        }
        System.out.println("aaaaa");
    }


    public static void main(String[] args) {
        ExceptionDemo2.show();
    }
}

1. 注意执行顺序

如果try中代码不出错,则直接执行finally

如果try中代码出错,则会跳入catch中,执行完catch在执行finally

2. return 和 finally

(1)正常情况,try块中有return, 而finally中没有,且在finally块中没有对return 值得操作,则执行完finally,返回return

(2)如果 try块中有return, 而finally块中也有return,则finally块中的return会覆盖try中的。

(3)如果 try块中有return, 而finally块中没有return,但是却对return的值进行了操作。

  • 如果return的是基本类型,则finally中的操作对返回的值无影响。

这里做一个分析。当try中执行到return时,return后面的值不会马上返回,而是会复制一份返回信息到一个新的局部变量,是由于finally的存在。当执行完finally后,会把之前复制的那一份返回。所以finally操作无影响。

  • 如果return的是引用类型,则finally中的操作对返回值同样也不会变化,这里的不会变化指的时指向该对象的地址不会变化,但是如果在finally中操作了对象中的属性,则返回的该对象的属性是发生了变化的。

更具体的情况参考:https://blog.csdn.net/jiandabang/article/details/103659052,从字节码的层面进行分析的。通过javap 命令得到字节码,分析方法的指令步骤,非常详细。

3. 为什么fianlly块始终都会执行呢,原因是在编译的时候,会将finally块中的代码分别拷贝到所有可能的分支下(try ,还有catch下)

4. finally块不执行的情况

(1)try...catch...finally 块没执行到

(2)try块中报异常,catch语句中有system.exit(1);

package com.mark.java.exception;

public class ExcepDemo {
    
    public void show(){
        try{
            int a = 1/0;
        }catch (Exception e){
            System.exit(1);
        }finally {
            System.out.println("finally");
        }

    }
        
        
}

 

  • throws 声明

向外抛异常,当前程序不处理异常,抛到外边进行处理

throw抛出异常对象

throw new Exception("aaaaaaaaaa")

throw和throws区别

共同点:都是抛出异常,不负责处理。

区别:1. 确切的说throws不能加抛出异常,应该叫声明异常,可以声明多个异常。而throw只能抛出一个异常对象;

2. throws声明后,虽然在这次不做处理,但是外部调用它的最终都是需要处理的(捕获异常或者声明异常)。而throw抛出异常,可以不进行处理,不会报错。但是这个行为肯定是不对的。 

3. throws 声明一般会声明到方法或者类上,而throw则是在方法内部。

package com.mark.java.exception;

import com.tzw.entity.EcifClient;
import jdk.internal.util.xml.impl.Input;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class ExceptionDemo3 {

    //使用throws,外部调用一定要处理。,要不再次throws,要不try catch处理掉
    public static void show() throws FileNotFoundException {
        InputStream inputStream = new FileInputStream("a.txt");
    }
    //使用throw,可以不用处理,不会编译报错
    public static void show2() {
        try {
            int i = 1/0;
        } catch (RuntimeException e) {
            throw new RuntimeException("aa");
        }
    }

    public static void main(String[] args) {
        show2();
        try {
            show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

自定义异常

继承Exception 类或者 ,RuntimeException类,进行自定义类

package com.mark.java.exception;


import java.util.Scanner;

public class ExceptionDemo4 extends RuntimeException {

    public ExceptionDemo4(String code, String message, String... arg) {
        String format = String.format("错误码为%s,报错信息为%s", code, message);
        String a = "";
        for (int i = 0; i < arg.length; i++) {
            a+=","+arg[i];
        }
        String b = "";
        System.out.println(b=a.substring(1));
        String replace = format.replace("%s", b);
        replace=replace+",参数列表为"+b;
        System.out.println(replace);
    }
}


class A{

    public static void show(){
        int i = 0;
        try {
            Scanner scanner = new Scanner(System.in);
            i =scanner.nextInt();
            int a = 1/i;
        } catch (Exception e) {
            throw new ExceptionDemo4("aaaa","除数不能为%s",String.valueOf(i),"sss");
        }

    }


    public static void main(String[] args) {
        show();
    }
}

 

异常的分类

1 . Throwable分  Error 和 Exception

2.  Exception分为 编译时异常(checked异常)和RunTimeException运行时异常 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值