实验八 异常处理

实验目的

了解异常的概念和异常处理机制
掌握捕捉异常的方法
掌握创建自定义异常
实验学时 2学时

实验内容

1.编写一个程序,要求从键盘输入一个圆的半径(double类型),计算并输出圆的面积。在没有加入异常处理机制时,输入的数据不是double型数据(如字符串“abc”)会产生什么结果?加入异常处理机制后,让程序在输入不正确的类型数据时给出错误提示并要求重新输入。 

package code81;
import java.util.InputMismatchException;  //导入输入不匹配异常
import java.util.Scanner;
public class code81 {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        input:
        while(true) {  //循环输入
        try {  //选定捕获异常的范围
            Scanner in = new Scanner(System.in);  
            double r,area;
            System.out.println("请输入圆的半径:");
            r=in.nextDouble();
            area=r*r*3.14;
            System.out.println("圆的面积为:"+area);
          }catch(InputMismatchException e) {  //处理输入不匹配异常
              System.out.println("输入的数据不符合要求!");
              System.out.println("请重新输入");
              e.printStackTrace();  //在命令行打印异常信息在程序中出错的位置及原因
              continue input;  //持续输入,确保输入的数据正确
          }
          }
    }
 
}

2.分析下面的程序。

(1)程序在运行时会产生哪些异常?怎样捕获并处理异常?

(2)修改代码:不管程序在执行过程中会不会产生异常,最后都输出“程序运行结束”

import java.util.Scanner;

public class ExceptionSample {

public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);

    int a[]=new int[5];

    int n,sum=0;

    float average;

              n=sc.nextInt();

              for(int i=0;i<n;i++){

                 a[i]=sc.nextInt();

                 sum=sum+a[i];

              }

              average=(float)sum/n;

              System.out.println(average);

      }

}

可能会产生输入的数据不匹配异常、除0异常、数组越界异常;
package code82;
import java.util.Scanner;
import java.util.InputMismatchException;  //导入输入不匹配异常
 
public class ExceptionSample1 {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc=new Scanner(System.in);
        int a[]=new int[5];
        int n,sum=0;
        float average;
        n=sc.nextInt();
        for(int i=0;i<n;i++) {
            try {  //选定捕获异常的范围
            a[i]=sc.nextInt();
            sum=sum+a[i];
            average=(float)sum/n;
            System.out.println(average);
        }catch(InputMismatchException e) {  //处理输入不匹配异常
            System.out.println("输入的数据格式不符合要求!");
        }catch(ArithmeticException e) {  //处理除0异常
            System.out.println("除0异常!");
        }catch(ArrayIndexOutOfBoundsException e) {  //处理数组越界异常
            System.out.println("数组越界异常!");
        }
        }
    }
}

2.修改代码:不管程序在执行过程中会不会产生异常,最后都输出“程序运行结束”

package code82;
import java.util.Scanner;
import java.util.InputMismatchException;  //导入输入不匹配异常
public class ExceptionSample2 {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc=new Scanner(System.in);
        int a[]=new int[5];
        int n,sum=0;
        int average;
        try {  //选定捕获异常的范围
            n=sc.nextInt();
            for(int i=0;i<n;i++) {
                a[i]=sc.nextInt();
                sum=sum+a[i];
            }
            average=sum/n;
            System.out.println(average);
        }catch(InputMismatchException e) {  //处理输入不匹配异常
            System.out.println("输入的数据格式不符合要求!");
        }catch(ArithmeticException e) {  //处理除0异常
            System.out.println("除0异常!");
        }finally {  //保证最后程序都按要求输出
            System.out.println("程序运行结束!");
        }
 
    }
 
}

3.设计一个程序,输入两个整数和一个算术运算符(+、-、*、/),根据运算符,计算两个整数的运算结果。考虑到用户输入的数据不合法,需要捕获异常(数据格式异常、除零异常、非法运算符异常)。

package code83;
import java.util.Scanner;
import java.util.InputMismatchException;  //导入输入不匹配异常
public class Calculate {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        int a,b;
        String c;
        try {  //选定捕获异常的范围
            System.out.println("请输入需要计算的两个整数:");
            a=in.nextInt();
            b=in.nextInt();
            System.out.println("请输入运算符:");
            c=in.next();
            switch(c) {
            case "+":
                System.out.println(a + c + b +"="+(a+b));
                break;
            case "-":
                System.out.println(a + c + b +"="+(a-b));
                break;
            case "*":
                System.out.println(a + c + b +"="+(a*b));
                break;
            case "/":
                System.out.println(a + c + b +"="+(a/b));
                break;
            default:  
                throw new Exception();  //声明抛弃异常
            }
        }catch(InputMismatchException e) {  //处理数据不匹配异常
            System.out.println("数据格式异常!");
        }catch(ArithmeticException e) {  //处理除0异常
            System.out.println("除0异常!");
        }catch(Exception e) {  //处理default语句中抛弃的非法运算符异常
            System.out.println("非法运算符异常!");
        }
            
 
    }
 
}

4.设计一个程序,根据三角形的三边求三角形面积。要求自定义一个异常类IllegaException,在求面积的方法area()中声明抛出这个异常类型,当从键盘输入三条边的数据不能构成三角形时抛出异常。

package code84;
import java.util.Scanner;
import java.util.InputMismatchException;  //导入输入不匹配异常
public class Triangle {
    public static double area(int a,int b,int c) throws IllegaException {  //构造求三角形面积的方法
        if(a+b<=c || a+c<=b || b+c<=a || a<=0 || b<=0 || c<=0) {
            throw new IllegaException();  //抛出异常的类型
        }
            double s=(a+b+c)/2.0;
            double area=Math.sqrt(s*(s-a)*(s-b)*(s-c));
            return area;  //求三角形的面积
        }
    public static void main(String[] args) throws IllegaException {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        int a,b,c;
        System.out.println("请输入三角形的三边长:");
        try {  //选定捕获异常的范围
            a=in.nextInt();
            b=in.nextInt();
            c=in.nextInt();
            System.out.println("三角形的面积为:"+area(a,b,c));  //调用求面积的方法,输出面积的值
        }catch(InputMismatchException e) {  //处理输入不匹配异常
            System.out.println("输入的数据格式不匹配!");
        }
 
    }
 
}
package code84;
 
public class IllegaException extends Exception {  //自定义异常类IllegaException
    IllegaException(){  //构造方法
        System.out.println("这样的三边不能构成一个三角形!");
    }
 
}

实验小结

使用异常处理比传统的错误管理技术更具优势;
使用异常处理可以将错误处理代码与正常代码分离;
如果一个方法并不知道如何处理所出现的异常,则可以在声明该方法时声明抛弃该异常;
除了运行时异常以外的继承于Exception类的子类都统称为非运行时异常,对于这类异常,Java编译器要求程序必须捕获或者声明抛弃异常;
捕获异常:try...catch...finally;
不论try语句块中是否有异常发生,finally语句块都会被执行;
如果Java提供的系统异常类型不能满足程序设计的需要,就可以设计自己的异常类型。Java推荐用户的异常类型以Exception为直接父类。

猜你喜欢

转载自blog.csdn.net/foxmaxiaoyu/article/details/125094357