第六章 异常机制(尚学堂java300集笔记,含自写编程题答案)

第六章 异常机制

DAY16

  • Java是采用面向对象的方式来处理异常的。处理过程:

    • 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。
    • 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
  • 异常分类

    • 图6-2 Java异常类层次结构图.png
    • Error表明系统JVM已经处于不可恢复的崩溃状态中,我们不需要管它。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。
    • Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。
  • CheckedException已检查异常(编译器异常),处理方式有两种:使用“try/catch”捕获异常、使用“throws”声明异常

  • 捕获异常是通过3个关键词来实现的:try-catch-finally

  • 子类异常在父类异常前面

  • 即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出

  • finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行

  • 方法重写中声明异常原则:子类声明的异常范围不能超过父类声明的范围

  • 自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类

作业

一、1.DC(try语句中没有异常,输出“try”,即使try和catch块中存在return语句,finally语句也会执行) 2.C 3.DAC(1处 应为throws,3处应为throw) 4.BC 5.B

三、

package cn.sxt.oo;

import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		System.out.println("输入分数:");
		Scanner scanner = new Scanner(System.in);
		int scr = scanner.nextInt();
		Scour scour = new Scour();
		scour.setScour(scr);
		scour.getScour();
	}
}

class Scour {
	private int scour;
	public int getScour() {
		if(scour>=0&&scour<=100) {
			System.out.println(scour);
		}
		return scour;
	}
	public void setScour(int scour) {
		if(scour<0||scour>100) {
			try {
				throw new ScourExceptin("分数范围需在0-100之间");
			}catch(ScourExceptin e) {
				e.printStackTrace();
			}	
		}
		this.scour = scour;
	}
	
}

class ScourExceptin extends Exception{
	public ScourExceptin() {
		
	}
	
	public ScourExceptin(String message) {
		super(message);
	}
	
}

或:

package cn.sxt.oo;

import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		System.out.println("输入分数:");
		Scanner scanner = new Scanner(System.in);
		int scr = scanner.nextInt();
		Scour scour = new Scour();
		scour.setScour(scr);
		scour.getScour();
	}
}

class Scour {
	private int scour;
	public int getScour() {
		if(scour>=0&&scour<=100) {
			System.out.println(scour);
		}
		return scour;
	}
	public void setScour(int scour) {
		if(scour<0||scour>100) {
			throw new ScourExceptin("分数范围需在0-100之间");
		}
		this.scour = scour;
	}
	
}

class ScourExceptin extends RuntimeException{
	public ScourExceptin() {
		
	}
	
	public ScourExceptin(String message) {
		super(message);
	}
	
}
package cn.sxt.oo;

import java.util.Scanner;

public class Test2 {
	public static void main(String[] args) {
		System.out.println("输入三角形边长a=");
		Scanner sca1 = new Scanner(System.in);
		int a = sca1.nextInt();
		System.out.println("输入三角形边长b=");
		Scanner sca2 = new Scanner(System.in);
		int b = sca2.nextInt();
		System.out.println("输入三角形边长c=");
		Scanner sca3 = new Scanner(System.in);
		int c = sca3.nextInt();
		isTriangle(a,b,c);
		
	}
	
	static void isTriangle(int a,int b,int c) throws IllegalArgumentException {
		if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a) {
			System.out.println("三角形三边长为:"+a+","+b+","+c);
		}else {
			throw new IllegalArgumentException("a,b,c不能构成三角形");
		}
	}
	
}

3.参考

package cn.sxt.oo;

import java.util.Scanner;

public class Test3 {	
	public static void main(String[] args) {
		//异常和Scour类在Test1中已经定义,在同一个包下,可以直接使用
		System.out.println("输入学生数量:");
		Scanner scanner1 = new Scanner(System.in);
		int n = scanner1.nextInt();
		Scour[] scour = new Scour[n];
		int i;
		int sum =0;
		for(i=0;i<n;i++) {
			try {
				System.out.println("输入第"+(i+1)+"个学生的分数:");
				Scanner scanner2 = new Scanner(System.in);
				int a = scanner2.nextInt();
				Scour stu = new Scour(); //新建Scour对象,因为scour是数组,其中每个元素都是一个Scour对象;
				scour[i] = stu;          //直接写scour[i].setScour(a);会报java.lang.NullPointerException的异常
				scour[i].setScour(a);
				sum += a;
			}catch(ScourExceptin e) {
				e.printStackTrace();
				i--;
				continue;
			}
		}
		int average = sum/n;
		System.out.println(n+"个学生的平均分为:"+average);
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值