Lab 9: 异常(Exception)
本次 Lab 时长为 2 周,DDL 为 11 月 20 日 23:59。
‐“对方不想跟您说话,并向您抛出了一个异常。"
完备的异常处理机制是 Java 程序安全可靠的一大原因,灵活地使用异常可以提高程序的鲁棒性(Robust),在编写代码中也能够以更优雅的方式处理潜在的错误,即使无法恢复,也能提供有效的信息供开发人员 Debug。
实验目的
- 掌握异常处理机制
- 掌握使用
try... catch... finally
处理异常
- 掌握使用
throws
关键字
- 掌握使用
throw
关键字
- 创建用户自定义异常,并处理这种异常
异常并不等于错误!异常只是表明程序没有按照期望的方式执行,我们捕获异常是为了让程序恢复正常运行,而错误往往是不可恢复的。当然,可以认为不可恢复的异常是错误。
实验题目
Question 1: Java中的检查型异常 (checked exception)
和非检查型异常 (unchecked exception)
有什么区别?(简答)
Question 2: 简述Java异常处理中 throws
和 throw
关键字的作用。 (简答)
Question 3: 请列出2个常见的运行时异常和2个非运行时异常。 (简答)
Question 4: 指出下列程序的错误并改正。(改错)
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: 指出下列程序的错误并改正。(改错)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.io.IOException;
public class SuperClass { public void start() throws IOException { throw new IOException("Unable to start"); } }
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: 写出以下程序的输出。(程序输出)
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: 写出以下程序的输出,试着解释三个函数不同输出的原因。(程序输出)
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
,其中有成员 x
,y
,z
作为三边长,类型为 double
,构造方法 Triangle(a, b, c)
分别给 x
,y
,z
赋值
- 求面积方法
public double getArea()
- 显示三角形信息(三个边长)
public void showInfo()
- 上述两个方法中当三条边不能构成一个三角形时要抛出自定义异常
NotTriangleException
,否则显示正确信息。
- 在测试类
TriangleTest
中的主方法中构造一组 Triangle
对象,显示三角形信息和面积,要求捕获异常。