第六章 异常机制
DAY16
-
Java是采用面向对象的方式来处理异常的。处理过程:
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。
- 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
-
异常分类
- 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);
}
}