Java异常捕捉机制

Java异常捕捉机制

1、简介

异常指的是程序运行时出现的非正常情况,Java中的异常捕捉最经常使用到的是try和catch两个代码块。本博客讲解的程序是工程训练基本任务1.4中的问题,该任务我是在4月份初学Java时完成的,故定会有许多不足,若有不足之处,恳请大家指出。


2、基本任务和代码

(1)任务1

1)任务内容
完成c=a/b 的计算并输出c的结果,其中用户可以通过键盘输入a和b的数值(),要求当 b 为0时c的计算结果正确。

2)任务代码
首先需要明确的是除法运算中除数不能为0,即该计算中的b不能为0,若b=0则判断为异常;要求用户可以自行输入a和b的值则需要使用到之前的博客《使用Java实现一元二次方程求根计算器》中讲到的“应声虫”的方法;
由于浮点型变量float和double两种类型的变量在输入b=0后不会抛出异常,所以只能定义整数型变量,在定义了两个整数变量a和b后,该程序的a和b只能输入整数具体代码如下:

import java.util.Scanner;//导入java.util包下的Scanner类
public class Test1{//类名
    public static void main(String[] args) {//程序主入口函数,带命令行参数
        while(true){//定义死循环
            System.out.print("求c=a/b的值"+"\n");//输出标题
            Scanner in=new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
            System.out.print("请输入a的值:");//输出
            int a=in.nextInt();//用户可自行定义a的值
            System.out.print("请输入b的值:");//输出
            int b=in.nextInt();//用户可自行定义b的值
            try{//try代码块,当发生异常时会转到catch代码块中
                int c=(a/b);//定义c等于a除以b
                System.out.print("c="+c);//无异常时输出c的值
                System.out.println(" ");//格式调整
            }
            catch(ArithmeticException e){//当try代码块有异常时转到catch代码块
                System.out.print("输入错误,除数不能为0");//当用户输入b=0时输出异常信息
                System.out.println(" ");//格式调整
            }
        }
    }
}

3)运行结果
LICEcap截取的动图如下:
这里写图片描述

(2)任务2

1)任务内容
完成一个计算绝对值表达式 |a-b|的功能要求当b比a大时人为抛出一个自定义异常。

2)任务代码
程序中几乎每一句代码都有注释,故我直接贴代码了:

import java.util.Scanner;//导入java.util包下的Scanner类
public class Test2{//类名
    public static void main(String[] args) {//程序主入口函数,带命令行参数
        while(true){//定义死循环
            System.out.println("求|a-b|的值");//输出标题
            Scanner in=new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
            System.out.print("请输入a的值:");//输出
            int a=in.nextInt();//用户可自行定义a的值
            System.out.print("请输入b的值:");//输出
            int b=in.nextInt();//用户可自行定义b的值
            int g;//定义一个整型变量g
            chuliyichang d=new chuliyichang();//创建一个处理异常类的对象
            try{//try代码块,当发生异常时会转到catch代码块中
                int c=d.chuli(a,b);//可能出现异常的地方,以此来输出a-b
                System.out.println("|a-b|="+c);//未出现异常则输出c的值
                System.out.println("此时未出现异常"+"\n");//输出提示
            }
            catch(MyException e){//当try代码块有异常时转到catch代码块
                g=b-a;
                System.out.print(e);//把接收到的异常信息赋值给e并输出"此时b>a"
                System.out.println("|a-b|="+g);//出现异常时采用其他方法解决问题
                System.out.println("此时出现了异常"+"\n");//输出提示
            }

        }
    }
}
class chuliyichang{//定义一个异常类,出现异常时抛出信息
    public int chuli(int a,int b)throws MyException{//定义一个函数处理异常
        int g;//定义一个整型变量g
        if(b>a){//if语句的条件b>a
            throw new MyException("此时b>a"+"\n");//需要抛出的异常信息
        }
        else{
            g=a-b;//正常情况下输出绝对值
        }
        return g;//返回值
    }
}
class MyException extends Exception{//自定义异常类,继承自Exception类
    MyException(String msg){//构造函数
        super(msg);//继承于父类用super
    }
}

3)运行结果
LICEcap截取的动图如下:
这里写图片描述


3、挑战任务和代码

(1)任务1

1)任务内容
完成一个 程序,用户自行输入某门课程的成绩的字符串,当输入非法数字(输入值小于0或大于100)时提示成绩输入有误,当输入为非数字的字符串时提示输入格式不合法。

2)任务代码
代码如下:

import java.util.Scanner;//导入java.util包下Scanner类
public class grade {//类名
    public static void main(String[] args) {//程序主入口函数,带命令行参数
        while(true){//定义死循环
        chuliyichang c=new chuliyichang();//创建一个处理异常类的对象
        System.out.println("求请输入同学的成绩:");//输出标题
        Scanner in=new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        try{//try代码块,当发生异常时会转到catch代码块中
            String grade=in.next();//将获取内容赋值给grade
            c.chuli(grade);//构造函数看是否出现异常
        }
        catch(NumException n){//当try代码块有异常时转到catch代码块
            System.out.println(n);//抛出异常“成绩输入有误”
        }
        catch(WordException w){//当try代码块有异常时转到catch代码块
            System.out.println(w);//抛出异常“输入格式不合法”
        }
    }

} }
class chuliyichang{//定义一个异常类,出现异常时抛出信息
    public String chuli(String grade)throws NumException,WordException{//定义函数处理异常
        for(int i=0;i<grade.length();i++){//对字符串进行遍历
            if(grade.charAt(i)<'0'||grade.charAt(i)>'9')//if语句判断字符串中的字符小于0或大于9
                throw new WordException("输入格式不合法"+"\n");//需要抛出的异常信息
        }
        int gradea=Integer.parseInt(grade);//将字符串转换为int型
        if(gradea<0||gradea>100)//if语句判断成绩小于0或大于100
            throw new NumException("成绩输入有误"+"\n");//需要抛出的异常信息
        return grade;//返回
    }
}
class WordException extends Exception{//自定义异常类,继承自Exception类
    WordException(String msg){//构造函数
        super(msg);//继承于父类用super
    }
}
class NumException extends Exception{//自定义异常类,继承自Exception类
    NumException(String msg){//构造函数
        super(msg);//继承于父类用super
    }
}

3)运行结果
LICEcap截取的动图如下:
这里写图片描述

(2)任务2

1)任务内容
完成一个程序,用户通过键盘输入用户名和密码的两个String类对象,然后程序进行判断,若用户名或密码为null,抛出自定义异常并结束程序;若输入密码长度小于6个字符,抛出自定义异常并结束程序;若用户名和密码不等于事先指定的字符串,抛出自定义异常并结束程序;否则输出提示“用登录成功”。

2)任务代码
我将用户名设置为luosiyang,密码为726726,然后通过该程序进行输入的判断,由于在抛出异常时要结束程序,故我未使用while循环,该程序代码如下:

import java.util.Scanner;//导入java.util包下Scanner类
public class register {//类名
    public static void main(String[] args) {//程序主入口函数,带命令行参数
        chuliyichang c=new chuliyichang();//创建一个处理异常类的对象
        Scanner in=new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        String s1;//定义字符串变量s1
        String s2;//定义字符串变量s2
        try{//try代码块,当发生异常时会转到catch代码块中
            System.out.println("请输入账户和密码:");//输出提示信息
            c.chuli(s1=in.nextLine(),s2=in.nextLine());//构造函数,并在用户输入信息后判断是否异常
        }
        catch(error e){//当try代码块有异常时转到catch代码块
        System.out.println(e);//输出异常信息“账户或密码输入错误”
        System.exit(0);//程序结束
        }
        catch(minerror m){//当try代码块有异常时转到catch代码块
            System.out.println(m);//输出异常信息“密码长度不能小于六个字符”
            System.exit(0);//程序结束
        }
        catch(wordnull w){//当try代码块有异常时转到catch代码块
            System.out.println(w);//输出异常信息“账户和密码不能为空”
            System.exit(0);//程序结束
            }
      }
}
class chuliyichang{//定义一个异常类,出现异常时抛出信息
    public void chuli(String s1,String s2)throws error,minerror,wordnull{//定义函数处理异常
        if(s1.equals("")||s2.equals("")){//if语句判断账户和密码是否为空
            throw new wordnull("账户和密码不能为空");//需要抛出的异常信息
        }
        if(s2.length()<6){//if语句判断密码长度是否小于六个字符
            throw new minerror("密码长度不能小于六个字符");//需要抛出的异常信息
        }
        if(!s1.equals("luosiyang")||!s2.equals("726726")){//判断账户密码是否输入正确
            throw new error("账户或密码输入错误");//需要抛出的异常信息
        }
        else System.out.println("用户登录成功");//如果输入正确则输出该信息
        }
}
class error extends Exception{//自定义异常类,继承自Exception类
    error(String msg){//构造函数
        super(msg);//继承于父类用super
        }
}
class minerror extends Exception{//自定义异常类,继承自Exception类
    minerror(String msg){//构造函数
        super(msg);//继承于父类用super
        }
}
class wordnull extends Exception{//自定义异常类,继承自Exception类
    wordnull(String msg){//构造函数
        super(msg);//继承于父类用super
        }
}

3)运行结果
由于未使用while循环,故需要运行程序四次分别实验,所以这个程序的运行就不使用LICEcap截取动图了,运行结果如下:
a、当输入为空时该程序的输出为:
这里写图片描述

b、当输入的密码过短时的输出为:
这里写图片描述

c、当输入的密码不正确时的输出为:
这里写图片描述

d、当输入的账户和密码正确时的输出为:
这里写图片描述
从四次不同输入的输出结果中可以看出,每当有异常情况发生时该程序都能正确捕捉异常并把异常信息抛出。

4、总结

由于我是一个初学者,故编写的程序中定会有一些不足,请大家别太介意,对于该程序的实现过程有许多我未写出,如果需要更加详细的实现过程,可以在评论区留下邮箱,我会把训练任务的word文档进行分享。

猜你喜欢

转载自blog.csdn.net/lsylsy726/article/details/80583107