Java零基础之异常(新手必看)

异常

本质上异常是程序上的错误,包括程序逻辑错误和系统错误

异常体系

所有异常的父类--------Throwable

  1. Error(不可处理)
    1. 运行期异常(RuntimeException)
    2. 非运行期异常
  2. Exception(可处理)

常见异常

  • IndexOutOfBoundsException

    下标越界,例如数组长度为5,却操作第十位的数据

  • NullPointerExceptiopn

    空指针异常,未赋值便操作

  • ArithmeticException

    异常运算条件 例如:7除0

  • IllegalArgumentException

    非法参数

  • ClassCastException

    强制类型转换实例错误,例如:

    Man extends People

    Woman extends People

    People person = new Man( );

    Woman xx = (Woman) person;

异常处理流程

try --catch–finally(总会运行,多用于释放资源)

  1. 首先运行try中的代码块

  2. 若有异常则进行catch捕获异常,并根据异常的种类,执行不同的catch中的代码

  3. 无论如何最终都会运行finally中的代码

    try尝试
    {
      需要被检测异常的代码
    }
    catch(异常类 变量)
    {
      处理异常的代码
    }
    catch(异常类 变量)
    {
      处理异常的代码
    }
    finally最终化
    {
      一定会被执行的代码
    }
    

异常处理原则

  1. 方法内如果抛出需要检测的异常,那么方法上必须要声明,否则必须在方法内用try-catch捕捉,否则编译失败。

  2. 如果调用了声明异常的函数,要么try-catch要么throws,否则编译失败。

  3. .什么时候catch,什么时候throws?功能内容可以解决,用catch,解决不了,用throws告诉调用者,有调用者解决。

  4. 如果一个功能抛出了多个异常,那么调用时必须有对应多个catch进行针对性的处理。

异常的抛出 **throws Exception **

当我们将该类的异常直接抛出后,可以不用在此类中执行该类的try catch的异常捕获操作,进而将异常抛到执行该类的类中去进行try catch操作

public class ThrowsException {
//显示异常  必须处理,如果不在该类中处理,那就必须在调用它的类中使用


    public static Date dateTransfer(String date) throws ParseException {//抛出此异常,所以此类中可有不用处理该异常
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.parse(date);
    }
    public static void main(String[] args) {
        try {
            System.out.println(dateTransfer("1999-02-78"));
        } catch (ParseException e) {//调用了该方法,所以必须处理该异常,并且已经无法再向外抛出
            e.printStackTrace();
        }

    }
}

throw &throws

throw为人为触发一个异常,出现在方法内部后面跟异常对象

throws为可能出现的异常,出现在方法声明上

自定义异常

可以通过extends Exception来自定义一个异常

例如下面代码展示的 AppException & SystemException

AppException code

public class AppException extends Exception {
    private int ErroCode;
    private String ErrorMessage;

    public int getErroCode() {
        return ErroCode;
    }

    public void setErroCode(int erroCode) {
        ErroCode = erroCode;
    }

    public String getErrorMessage() {
        return ErrorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        ErrorMessage = errorMessage;
    }

    public AppException(int erroCode, String errorMessage) {
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

}

//TestCode============================================

public class TestException {

    public static int Divide(int a,int b) throws AppException {
                  try{
                      return a/b;
                  }catch(Exception e){
                          throw new AppException(999,"AppException");//throw人为抛出一个异常,将原有的异常转化为A异常
                  }

    }

    public static void main(String[] args) {
        try {
            System.out.println(Divide(2,0));
        } catch (AppException e) {
            System.out.println(e.getErroCode());
            System.out.println(e.getErrorMessage());
        }
    }
}


SystemException code

public class SystemException extends Exception {
    private int ErroCode;
    private String ErrorMessage;

    public int getErroCode() {
        return ErroCode;
    }

    public void setErroCode(int erroCode) {
        ErroCode = erroCode;
    }

    public String getErrorMessage() {
        return ErrorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        ErrorMessage = errorMessage;
    }

    public SystemException(int erroCode, String errorMessage) {
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, int erroCode, String errorMessage) {
        super(message);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, Throwable cause, int erroCode, String errorMessage) {
        super(message, cause);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(Throwable cause, int erroCode, String errorMessage) {
        super(cause);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }

    public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, int erroCode, String errorMessage) {
        super(message, cause, enableSuppression, writableStackTrace);
        ErroCode = erroCode;
        ErrorMessage = errorMessage;
    }
}
//TestCode=============================================

public class TestSys {

    public static int Divide2(int a) throws SystemException {
        try{
            int []aaa = new int[2];
            aaa[3]=a;
            return aaa[3];
        }catch(Exception e){
            throw new SystemException(1000,"system error");
        }

    }

    public static void main(String[] args) {
        try {
            System.out.println(Divide2(34));
        } catch (SystemException e) {
            System.out.println(e.getErroCode());
            System.out.println(e.getErrorMessage());
        }
    }

}

常见异常方法:

Error

img

非运行期异常

img

运行期异常

img

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值