1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。
(1)import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;
try
{
k = i/j; // Causes division-by-zero exception
throw new Exception("Hello.Exception!");
}
catch ( ArithmeticException e)
{
System.out.println("被0除. "+ e.getMessage());
}
catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("被0除");
else
{
System.out.println(e.getMessage());
}
}
finally
{
JOptionPane.showConfirmDialog(null,"OK");
}
}
}
(2)在java中捕获异常的语句为:
Try{
//可能发生运行错误的代码;
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后” 的代码
}
(3)使用Java异常处理机制
当异常发生时,程序控制流程由try语句块跳转到catch语句块;
不管是否有异常发生,finally语句块中的语句始终保证被执行;
如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
(4)Java中的异常分类
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:
3.可以使用javap去反汇编两个示例程序的.class文件(一个是AboutException.class,另一个是ThrowDemo.class),从中你会有所发现的。
JVM在具体实现这两个指令时,采用了不同的处理策略,导致两段代码运行时得到不同的结果。
4.阅读以下代码(CatchWho.java),写出程序运行结果:
5.请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
public class EmbededFinally {
public static void main(String args[]) {
int result;
try {
System.out.println("in Level 1");
try {
System.out.println("in Level 2");
// result=100/0; //Level 2
try {
System.out.println("in Level 3");
result=100/0; //Level 3
}
catch (Exception e) {
System.out.println("Level 3:" + e.getClass().toString());
}
finally {
System.out.println("In Level 3 finally");
}
// result=100/0; //Level 2
}
catch (Exception e) {
System.out.println("Level 2:" + e.getClass().toString());
}
finally {
System.out.println("In Level 2 finally");
}
// result = 100 / 0; //level 1
}
catch (Exception e) {
System.out.println("Level 1:" + e.getClass().toString());
}
finally {
System.out.println("In Level 1 finally");
}
}
}
原因:当有多个嵌套的try…catch…finally时,异常在不同位置被接受,可能会导致异常下面的finally语句块执行顺序。不管是否有异常发生,finally语句块中的语句始终保证被执行。
6.finally语句块一定会执行吗?
public class SystemExitAndFinally {
public static void main(String[] args)
{
try{
System.out.println("in main");
throw new Exception("Exception is thrown in main");
//System.exit(0);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(0);
}
finally
{
System.out.println("in finally");
}
}
}
不会,System.exit(0)可以终止程序。
6.依据对本讲多个示例程序的分析,请自行归纳总结出Java多层嵌套异常处理的基本流程。
基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行。
7.编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
import java.io.*;
import java.util.Scanner;
public class Score {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String grade,scor;
double score;
try {
System.out.println("请输入你的成绩");
scor=scanner.next();
score=Double.parseDouble(scor);
assert score>=0 &&score<=100:"输入的成绩必须是0到100之间";
if(score<60) {
grade="不及格";
}
else if(score<70) {
grade="及格";
}
else if(score<85) {
grade="中";
}
else if(score<90) {
grade="良";
}
else {
grade="优";
}
System.out.println("等级为"+grade);
} catch(NumberFormatException e) {
System.out.println("输入必须为数字");
}
}
}
结果截图:
(1)输入0到100内的整数
(2)输入0到100内的小数
(3)输入不是数字的其他字符
(4)输入负数
(5)输入大于100的数