Lab 9: 异常(Exception)

本次 Lab 时长为 2 周,DDL 为 11 月 20 日 23:59

附件下载(包括问答题和实验报告模板):https://bhpan.buaa.edu.cn/link/AA96D0CA694BB74ABFA070F38B6C527AC6

‐“对方不想跟您说话,并向您抛出了一个异常。"

完备的异常处理机制是 Java 程序安全可靠的一大原因,灵活地使用异常可以提高程序的鲁棒性(Robust),在编写代码中也能够以更优雅的方式处理潜在的错误,即使无法恢复,也能提供有效的信息供开发人员 Debug。

实验目的

  • 掌握异常处理机制
  • 掌握使用 try... catch... finally 处理异常
  • 掌握使用 throws 关键字
  • 掌握使用 throw 关键字
  • 创建用户自定义异常,并处理这种异常

异常并不等于错误!异常只是表明程序没有按照期望的方式执行,我们捕获异常是为了让程序恢复正常运行,而错误往往是不可恢复的。当然,可以认为不可恢复的异常是错误。

实验题目

Question 1: Java中的检查型异常 (checked exception) 和非检查型异常 (unchecked exception) 有什么区别?(简答)

Question 2: 简述Java异常处理中 throwsthrow 关键字的作用。 (简答)

Question 3: 请列出2个常见的运行时异常和2个非运行时异常。 (简答)

Question 4: 指出下列程序的错误并改正。(改错)

>
ShowHide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.IOException;

public class Question4 {
public static void start() throws IOException, RuntimeException {
throw new RuntimeException("Unable to Start");
}

public static void main(String[] args) {
try {
start();
} catch (Exception ex) {
ex.printStackTrace();
} catch (RuntimeException re) {
re.printStackTrace();
}
}
}

Question 5: 指出下列程序的错误并改正。(改错)

>
ShowHide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SuperClass.java
import java.io.IOException;

public class SuperClass {
public void start() throws IOException {
throw new IOException("Unable to start");
}
}

// SubClass.java
import java.io.FileInputStream;

public class SubClass extends SuperClass {
public void start() throws Exception {
throw new Exception("Unable to open file");
}

public void open(String fileName){
FileInputStream fis = new FileInputStream(fileName);
}
}

Question 6: 写出以下程序的输出。(程序输出)

>
ShowHide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Question4 {
public static void main(String[] args) {
try {
methodA();
} catch (Exception e) {
methodB();
}
}

private static void methodA() {
try {
System.out.println("methodA 抛出一个异常!");
throw new RuntimeException();
} finally {
System.out.println("执行 methodA 的 finally!");
}
}

private static void methodB() {
try {
System.out.println("methodB 执行!");
} finally {
System.out.println("执行 methodB 的 finally!");
}
}
}

Question 7: 写出以下程序的输出,试着解释三个函数不同输出的原因。(程序输出)

>
ShowHide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Question7 {
public static void main(String[] args) {
System.out.println("-----------------------");
System.out.println(get0());
System.out.println("-----------------------");
System.out.println(get1());
System.out.println("-----------------------");
System.out.println(get2());
System.out.println("-----------------------");
}

public static int get0() {
int i = 1;
try {
throw new Exception();
} catch (Exception e) {
System.out.println("error");
return i;
} finally {
i++;
System.out.println("i in finally block:" + i);
}
}

public static String get1() {
String i = "ok";
try {
throw new Exception();
} catch (Exception e) {
System.out.println("error");
return i;
} finally {
i += " finally";
System.out.println("i in finally: " + i);
}
}

public static StringBuilder get2() {
StringBuilder i = new StringBuilder("ok");
try {
throw new Exception();
} catch (Exception e) {
System.out.println("error");
return i;
} finally {
i.append(" finally");
System.out.println("i in finally: " + i);
}
}
}

Question 8: 编写程序完成以下要求。(编程)

  • 自定义类 Triangle ,其中有成员 xyz 作为三边长,类型为 double ,构造方法 Triangle(a, b, c) 分别给 xyz 赋值
  • 求面积方法 public double getArea()
  • 显示三角形信息(三个边长)public void showInfo()
  • 上述两个方法中当三条边不能构成一个三角形时要抛出自定义异常 NotTriangleException ,否则显示正确信息。
  • 在测试类 TriangleTest 中的主方法中构造一组 Triangle 对象,显示三角形信息和面积,要求捕获异常。