java中try-catch以及异常类相关

本文深入讲解Java中的异常处理机制,包括throw与throws的区别、try-catch的使用、系统自带异常类及自定义异常类的创建与应用。通过实例演示如何在程序中有效利用异常处理来提升代码的健壮性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:异常简介 

 

二: 引言

先来一段较完整的程序段,因为这部分的知识比较碎,容易混乱,所以我们先整体了解一下。注意标红的字即可,没必要特别完完全全理解。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StrtransferDate {
    public static void main(String[] args) throws ParseException {
        try{
            String str="2016-06-06";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(str);
          //因为这里用到的类ParseException是系统自己的,所以尽管我们不显式的写出系统也会自动抛出。实际上是throw new ParseException();
          //但是如果我们抛出自定义异常类的话,这句话一定不能省略。必须显式给出,原因也不难理解。
            System.out.println(date);
        }catch (ParseException e){
            e.printStackTrace();
        }
    }
}


三:几个关键词

(I)throw和throws的不同。

1.throw是切切实实的抛出具体的错误。

2.throws跟在函数声明的后面,表示下面的程序段中所有可能抛出的错误(正因如此,所以有s) 

  具体区别如下图所示:

                          

 

(2)try-catch

       1. try后面的中括号里面加上可能出错的代码以及抛出错误的代码语句。

       2.catch(语句1){
            语句2
}          //catch可以有多个,因为try内可能抛出不同的异常类,因此catch也得有多个来承接

           //语句1主要是根据异常类建立一个对象供后面的{}使用,可以是自定义异常类,也可以是系统的本来就有的异常类

          //语句2是catch捕捉到try抛出的异常后执行的语句。后面会详细介绍。

    使用目的:在遇到运行时才能发现的错误时,try-catch后面的语句还可以执行,但是如果没有try-catch就jvm就直接退出程序了。而且有了try-catch可以方便我们快速定位修改代码错误。

(3)系统自带的异常类。

    不需要自己手动抛出,我们只需了解三个对象函数即可。(这三个函数都是在catch里面用的)

1.getMessage()
2.toString()
3.printStackTrace();

//功能相似,都是打印错误信息的,区别就在信息的详细程度不一样。

示例:

public static void method(){
        try{
            int []arr={1,2,3};
            System.out.println(arr[3]);
        }
        catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            e.printStackTrace();
        }
    }

(4)自定义异常类。

在编写程序的时候可以扩展Exception类来定义我们自己的异常类。 

自定义异常类继承自Exception,一定要写上继承的语句

 那我们为什么要自定义异常类呢?

    原因就在于对于一些我们自己编写的类,有时候错误很隐晦,语法上没错误,但是对于我们实际使用来讲,实际上是错误。就比如编写一个银行取钱的类,取钱的数字可以为正也可以为负,从语法角度上讲一点错误都没有,但是就我们实际生活而言,取钱的数字怎么可能有正又有负那?这时候为了符合实际情况,就需要自定义异常类。

  就以上面的例子,我们编写一个实际程序:

//自定义异常类1,BankException,
//银行支出就是负数,存入钱就是整数,这个异常类的作用就是处理收入是负数和支出是整数的情况。
public class BankException extends Exception {
    private String message;
    public BankException(int m,int n){
        message="入账资金"+m+"是负数或支出"+n+"是正数,不符合系统要求。";
    }
    public String Getmessage(){
        return message;
    }
}


//代表实际生活场景的类
public class Bank {
    private int money;
    Bank() {
    }
    public void income(int in, int out) throws BankException {
        if (in <= 0 || out >= 0 || in + out <= 0)
            throw new BankException(in, out);
        int netIncome = in + out;
        System.out.printf("本次计算出的纯收入是:%d元\n", netIncome);
        money = money + netIncome;
    }

    public int getMoney() {
        return money;
    }
}




//主类,负责执行代码
public class Test {
    public static void main(String[] args) {
        Bank bank=new Bank();
        try{
            bank.income(200,-100);
            bank.income(-300,200);//出错后面的就不再执行了,直接退出
            bank.income(300,-100);

        } catch (BankException e) {
//            系统本来的错误输出函数还可以用,三选一即可,
//            System.out.println(e.getMessage());
//            System.out.println(e.toString());
//            e.printStackTrace();
            
//            当然我们自定义的也可使用
            System.out.println(e.Getmessage());
        }
        System.out.println("库里面现有"+bank.getMoney());
    }
}

tip:根据Exception下面的子类分析总结得到,为了方便,我们都直接再异常类的构造函数中指定message这个字符串的值,这样外界通过 throw new 异常类名(参数) 这一句代码就能完成自定义异常类输出信息的组合,就例如上面程序段中的Bank类中的income函数中的throw new BankException(in, out);即完成了抛出,又完成了异常message的组合,方便后面的catch直接getMessage()捕捉输出。

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值