一、前言
前面我们说到异常(Exception)的概念与分类和异常(Exception)的分类处理方式,所谓异常就是程序在运行的过程中出现的一些中断程序的例外问题,我们将其称之为异常。
JDK 中定义了很多派生于Throwable类
的异常类,来对应解决可能出现的各种各样的异常,Throwable下又派生出来了子类Error
和Exception
,接下来我们进行编程训练学习并对其总结。
二、编程学习
1)除数为0
1.1 任务要求
- 完成一个 java application应用程序,完成c=a/b 的计算并输出c的结果,可以为a和b在程序中赋初值、或者接收用户通过键盘输入a和b的数值文本后转换为数字等,在程序要求当 b 为0时c的计算结果正确。
1.2 程序代码
import java.util.Scanner;//导入位于util包下的Scanner类
public class ExceptionTest10{//创建类名
public static void main(String[] args) {//主程序
while(true){//循环语句
System.out.print("求算式c=a/b的值"+"\n");//打印输出
Scanner ex=new Scanner(System.in);//创建scanner接受键盘输入
System.out.print("令a的值为:");//提示语句
int a=ex.nextInt();//将输入的值给a
System.out.print("令b的值为:");//提示语句
int b=ex.nextInt();//将输入的值给b
try{//将逻辑语句用try包起来
int c=(a/b);//定义c等于a除以b
System.out.print(" c= " +c);//输出c的值
System.out.println("\n ");//空行
}
catch(ArithmeticException e){//当代码异常时用catch捕捉
System.out.print("算式无意义,除数不能为0");//输出异常信息
System.out.println(" \n");//空行
}
}
}
}
1.3 执行结果
2)计算绝对值
2.1 任务要求
- 完成一个 java application应用程序,完成一个计算绝对值表达式 |a-b|的功能。要求当b比a大时人为抛出一个自定义异常,在计算绝对值时通过异常捕捉机制完成此绝对值表达式的计算。
2.2 程序代码
import java.util.Scanner;//导入位于util包下的Scanner类
public class ExceptionTest11{//创建类名
public static void main(String[] args) {//程序主入口函数,带命令行参数
while(true){//循环语句
//double a,b; //声明变量
System.out.println("\n求算式|a-b|的值");//输出标题
Scanner ex=new Scanner(System.in);//创建scanner接受键盘输入
System.out.print("令a的值为:");//提示语句
int a=ex.nextInt();//将输入的值给a
System.out.print("令b的值为:");//提示语句
int b=ex.nextInt();//将输入的值给a
Yichangtext n=new Yichangtext(); //定义一个变量n
try { //将逻辑语句用try包起来
int c=n.yc(a,b);//创建逻辑变量c
System.out.println("c=|a-b|\n"+"=|"+a+"-"+b+"|="+c);//输出正确的逻辑数c
}
catch (Exception exc) { 当代码异常时用catch捕获异常
System.out.println(exc.getMessage());//输出异常信息
exc.printStackTrace(); //输出导致异常的信息
int d = b-a;//创建异常变量d
System.out.println("|a - b| = " +d); //输出异常后的|a-b|结果
}
}
}
}
class MyException extends Exception{//自定义异常类,继承自Exception类
public MyException(String msg){//创建构造函数
super(msg);//用super继承父类
}
}
class Yichangtext{//定义一个异常类,出现异常时抛出信息
public int yc(int a,int b)throws MyException{//定义处理异常的函数
int c;//定义一个逻辑变量c
if(b>a){//用if语句判断是否b>a
throw new MyException("此时b>a,抛出异常"+"\n");//抛出异常信息
}
else{
c=a-b;//正常情况下输出绝对值
}
return c;//返回值
}
}
2.3 执行结果
注意
java中,如果 int/int 中除数为0,会抛出异常java.lang.ArithmeticException: / by zero
,这个不难理解!但如果是浮点型,就不会报异常了!
总结如下:
- 0.0/0.0 得到的结果是NaN(not an number的简称,即"不是数字")。通过
Double.isNaN(double x)
来判断。 正数/0.0 得到的结果是正无穷大,即Infenity - 负数/0.0 得到的结果是负无穷大,即Infenity。通过
Double.isInfinite(double x)
来判断。
三、总结
-
Error与Exception都继承自Throwable类
-
Error类层次描述了Java运行时系统内部错误和资源耗尽错误。
-
Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。
-
常见的异常类型
–ArithmeticException
–NullPointerException
–ClassCastException
–ArrayIndexOutOfBoundsException
–NumberFormatException
-
方法重写中声明异常原则:子类声明的异常范围不能超过父类声明的范围
-
异常处理的三种方式
–捕获异常:try-catch-finally
–声明异常:throws
- 自定义异常类只需从Exception类或者它的子类派生一个子类即可。
正常学习和开发中,我们经常会遇到各种异常。大家在遇到异常时,需要遵循下面四步来解决:
1. 细心查看异常信息,确定异常种类和相关Java代码行号;
2. 拷贝异常信息到百度,查看相关帖子,寻找解决思路;
3. 前两步无法搞定,再问同学或同事;
4. 前三步无法搞定,请示领导。
很多同学碰到异常一下就慌了,立刻开始请教别人搬救兵,殊不知这样做有两大坏处。第一、太不尊重别人,把别人当苦力。第二、失去提高自我的机会,自己解决一个异常,就意味着有能力解决一类异常。解决一类异常能大大提高自身能力。
希望大家都一起加油努力!~