速学堂java实战第六章异常机制作业
若有不对之处,望大家指正,谢谢
一、选择题
1.C try语句中没有异常,输出“try”,即使try和catch块中存在return语句,finally语句也会执行
2.C
3.AC //1处 应为throws,//3处应为throw
4.CD 答案应该为CD,题目中RuntimeException有:NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException、ClassNotFoundException(classloader加载类的时候发现类不存在在类路径的时候会报出,实际上为运行时异常)、ClassCastException; CheackedException有:InputMismatchException(因为查百度在RuntimeException中没有发现它,如果博主我说错了请大家指正); SexException不清楚是啥???
5.B 若输入字符串,则应该是InputMismatchException
二、简答题

  1. Error可以认为是java虚拟机出现错误,不是程序员处理的错误;Exception意思是异常,分为 CheckedException、RuntimeException,是程序员必须处理的异常
  2. CheckedException: 检查异常,若不处理编译器会报错,需要我们处理,处理方式有抛出(throws),捕获(try—catch—finally)
    RuntimeException:运行时异常,一般是编程时的逻辑错误,需要我们编程时注意。
  3. try:异常捕获并处理的范围,若捕获到异常则会跳到相应的catch语句
    catch:处理可能产生的不同类型的异常对象
    finally:不管是否发生了异常,都必须要执行的,常在finally中关闭程序块已打开的资源
    throw:抛出异常对象,只能跟一个
    throws: 在方法声明中抛出一个或多个异常对象
  4. 如上。
    三、编程题
  5. 编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。
    要求:使用自定义异常实现。
public class TestInputGrade {
	public static void main(String[] args) throws IllegalGradeException {
		
		Scanner Input = new Scanner(System.in);
		Student student = new Student();
		System.out.print("请输入您的分数:(范围:0-100分)");
		double stu_grade = Input.nextDouble(); 
		student.setGrade(stu_grade);
		
		System.out.println("您输入的分数为:"+student.getGrade());
		Input.close();
	}
}

//学生类
class Student{
	public double grade = 0;
	public Student() {
	}
	
	public void setGrade(double grade) throws IllegalGradeException {
		if(grade<0|grade>100) {
			throw new IllegalGradeException("分数必须在0-100之间");
		}else {
		this.grade = grade;
		}
	}

	public double getGrade() {
		return grade;
	}
}

//自定义非法分数异常
class IllegalGradeException extends Exception{
	//默认构造器
	public IllegalGradeException() {
	}
	
	//自定带参构造器
	public IllegalGradeException(String message) {
		super(message);
	}
}
  1. 写一个方法void isTriangle(int a,int b,int c),判断三个参数是否能构成一个三角形, 如果不能则抛出异常IllegalArgumentException,显示异常信息 “a,b,c不能构成三角形”,如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数, 调用此方法,并捕获异常。
public class ConstructTriangle {
	public static void main(String[] args) throws IllegalArgumentException {
	
		Scanner Input = new Scanner(System.in);
		System.out.print("请输入第一条边的长度(单位:cm):");
		int a = Input.nextInt();
		System.out.print("请输入第二条边的长度(单位:cm):");
		int b = Input.nextInt();
		System.out.print("请输入第三条边的长度(单位:cm):");
		int c = Input.nextInt();
		isTriangle(a,b,c);
		Input.close();
	}
	
	static void isTriangle(int a,int b,int c) throws IllegalArgumentException {
		if(a<0|b<0|c<0) {
			throw new IllegalArgumentException("a,b,c不能构成三角形");
		}else if(a+b>c&&a+c>b&&b+c>a) {
			System.out.println("创建三角形成功!边长分别为:"+a+","+b+","+c);
			
		}else {
			throw new IllegalArgumentException("a,b,c不能构成三角形");
		}
	}
}

class IllegalArgumentException extends Exception{
	//默认构造器
	public IllegalArgumentException() {
	}
	
	//自定义带参构造器
	public IllegalArgumentException(String message) {
		super(message);
	}
  1. 编写一个计算N个学生分数平均分的程序。程序应该提示用户输入N的值,如何必须输入所有N个学生分数。如果用户输入的分数是一个负数,则应该抛出一个异常并捕获,提示“分数必须是正数或者0”。并提示用户再次输入该分数。
public class CalculateAverage {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		//异常和Student类上面代码已经定义了,而且还在同一个包下,所有可以直接使用
		Scanner Input = new Scanner(System.in);
		int stu_num = 0;
		
		try {
		System.out.print("请输入您班的总人数:");
		stu_num = Input.nextInt();
		if(stu_num<0) {
			throw new IllegalArgumentException("班级人数不能小于等于0");
		}
		
		}catch(IllegalArgumentException e){
			e.printStackTrace();
		}
		
		System.out.println("一共有"+stu_num+"名学生");
		
		Student[] student;
		student = new Student[stu_num];

		double total_grade = 0;
		double stu_average = 0;
		double grade = 0;
		
		for(int i=0;i<student.length;i++) {
			try {
				System.out.print("请输入第"+(i+1)+"位学生的分数:");
				grade = Input.nextDouble();
				Student stu = new Student();
				student[i] = stu;
				student[i].setGrade(grade);
				total_grade+=grade;
			}catch(IllegalGradeException e) {
				e.printStackTrace();
				i--;
				continue;	
			}
		}
		
		stu_average = total_grade/stu_num;
		System.out.println("班级学生平均分为:"+stu_average);
		Input.close();
	}
}