一、任务目标
1.完成一个 java application应用程序,完成c=a/b 的计算并输出c的结果,可以为a和b在程序中赋初值、或者接收用户通过键盘输入a和b的数值文本后转换为数字等,在程序要求当 b 为0时c的计算结果正确。
2.完成一个 java application应用程序,完成一个计算绝对值表达式 |a-b|的功能。要求当b比a大时人为抛出一个自定义异常,在计算绝对值时通过异常捕捉机制完成此绝对值表达式的计算。
二、“异常”概述
1. 异常
在程序中,错误可能产生于程序员没有预料到的各种情况,在Java中这种在程序运行时可能出现的一些错误成为异常。异常是一个在程序执行期间发生的事情,它中断了正在执行的程序的正常指令流。如下图:
程序运行的结果报告发生了算术异常,在算术表达式“3/0”中,0作为除数出现,系统不再执行下去,提前结束。
2. 捕捉异常
2.1. try、catch和finally语句
Java语言的异常捕获结构由 try、catch和finally 3部分组成。其中,try 语句块存放的是可能发生异常的 Java 语句;catch 程序块在 try 语句块之后,用来激发被捕捉的异常;finally 语句块是异常处理结构的最后执行部分,无论 try 语句块中的代码如何退出,都将执行 finally 语句块。
语法如下:
try{
//程序块代码
}
catch(Exceptiontype e){
//对Exceptiontype e的处理
}
...
finally{
//程序块
}
2.2. try — catch语句块
try — catch语句块执行原理流程图:
当 try 代码块中的语句发生异常时,程序就会跳转到 catch 代码块中执行,执行完 catch 代码块的其他代码,而不会执行 try 代码块中发生异常语句后的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
3. 自定义异常
使用Java内置异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需要继承Exception类即可自定义异常类。
在程序中使用自定义异常类,大体克分为可分为以下几个步骤:
(1)创建自定义异常类。
(2)在方法中通过throw类关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
public class MyException(子类名) extends Exception{ //创建自定义方法,继承Exception类
public MyException(String ErroorMessage){ //构造方法
super(ErroorMessage) //父类构造方法
}
static int avg(int number1,int number 2)throws MyException{ //定义方法,抛出异常
//语句块
}
public static void main(String[] args){ //主方法
try{ //try方法代码块处理可能出现异常的代码
int result = avg(102,150);
}catch (MyException e){
System.out.println(e);
}
}
}
三、“异常捕捉机制”实际应用
任务1:
程序代码:
import java.util.Scanner; //导入Scanner类
class Count //创建类Count
{
public static void main(String[] args) //主函数
{
System.out.println("请输入a的值:");
Scanner str1 = new Scanner(System.in); //键入a的值并存入String类型变量str1中
int a = Integer.valueOf(str1.nextLine()); /*nextline()方法读取a的值并通过valueOf()方法
将String类型的数据转换为int型数据*/
System.out.println("请输入b的值:"); //键入b的值并存入String类型变量str2中
Scanner str2 = new Scanner(System.in);
int b = Integer.valueOf(str2.nextLine());
int c = 0;
try{ //try代码块处理可能出现的异常信息
c = a/b;
}catch(Exception e){
System.out.println("除数b不能为0,请重新输入b的值:");
Scanner str3 = new Scanner(System.in);
int B = Integer.valueOf(str3.nextLine());
c = a/B;
}
System.out.println("c = "+c);
}
}
运行结果:
任务2:
程序代码:
import java.util.Scanner; //导入Scanner类
class Tran { //创建类Tran
static class MyException extends Exception{ //创建自定义方法,继承Exception类
public MyException(String Error){ //构造方法
super(Error); //父类构造方法
}
}
public static void absolute(int num1, int num2)throws MyException {
if(num2 > num1){ //定义方法,抛出异常
throw new MyException("b大于a"); //错误信息
}
}
public static void main(String[] args) { //主函数
// TODO Auto-generated method stub
System.out.println("请输入a的值:");
Scanner str1 = new Scanner(System.in); //键入a的值并存入String类型变量str1中
int a = Integer.valueOf(str1.nextLine());
System.out.println("请输入b的值:"); //键入b的值并存入String类型变量str2中
Scanner str2 = new Scanner(System.in);
int b = Integer.valueOf(str2.nextLine()); /*nextline()方法读取a的值并通过valueOf()方法
将String类型的数据转换为int型数据*/
int c = 0;
try{ //try代码块处理可能出现的异常信息
c = a - b;
absolute(a,b); //调用方法,抛出异常
}catch(MyException e){
c = b - a;
}
System.out.println("|a - b| = " +c);
}
}
运行结果: