一. 实验目的
掌握 Java 程序中异常的概念,能熟练应用异常处理机制,设计出健壮性和可读性好的程序。
二. 实验内容
(一) 异常的发生
1.运行时异常
//RTExp.java
public class RTExp {
public static void main(String[] args) {
// TODO Auto-generated method stub
int d1 = Integer.parseInt(args[0]);
int d2 = Integer.parseInt(args[1]);
double result = d1 / d2;
System.out.println(args[0] + "/" + args[1] + "=" + result);
}
}
编译以上 java 程序 然后在命令行下运行,观察结果并分析。
(1) java RTExp 1
(2) java RTExp 1 0
(3) java RTExp 1 a
2.非运行时异常
常见的有加载类或接口失败,文件未找到等。 以下代码演示 ClassNotFoundException 运行 TestLoader,观察输出并分析。 补充定义被加载的类 Main,如下:
//先定义一个类加载器
public class MyClassLoader extends ClassLoader {
public Class loadClass(String name) {
Class c = null;
try {
c = loadClass(name, true);
} catch (ClassNotFoundException ce) {
ce.printStackTrace();
}
return c;
}
}
//再定义测试类
import java.lang.reflect.Method;
public class TestLoader {
public static void main(String[] args) {
MyClassLoader loader = new MyClassLoader();
Class main = loader.loadClass("Main");
System.out.println(main.toString());
Method[] ms = main.getMethods();
for (Method mt : ms) {
System.out.println(mt.toString());
}
}
}
运行 TestLoader,观察输出并分析。
补充定义被加载的类 Main,如下:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Clas Main/method main");
}
public void test(){
System.out.println("just test.");
}
}
再次运行 TestLoader,并分析运行结果。
(二) 异常处理机制
-
修改 RTExp 类,对数组越界和输入数据格式错误进行检查。
-
多异常处理时,注意 catch 语句块的顺序。 修改一下代码错误,使其通过编译,并输入不同测试用例,分析结果。
import java.util.InputMismatchException;
import java.util.Scanner;
public class MultiCatch {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
} catch (Exception e) {
e.printStackTrace();
} catch (InputMismatchException ie) {
ie.printStackTrace();
} catch (IllegalStateException le) {
le.printStackTrace();
}
}
}
(三) 自定义异常
自行设计相关类,实现用户登录功能,用异常体现业务规则。如用户登 录 时 需 要 输 入 用户名 和 密码, 如 果 不 匹配, 则 抛 出 NamePasswordMismatchException,要求重新输入,如果错误超过三次,则引发 ToomanyErrorsException,并结束程序运行
三、实验结果
(一) 异常的发生
1、
2、运行 TestLoader,观察输出并分析。
补充定义被加载的类 Main,
(二) 异常处理机制
(三) 自定义异常
目录结构
public class NamePasswordMismatchException extends RuntimeException {
public NamePasswordMismatchException(String message) {
super(message);
}
}
public class ToomanyErrorsException extends Exception {
public ToomanyErrorsException(String message) {
super(message);
}
}
import java.util.Scanner;
public class Login {
private static String username = "张三";
private static String password = "123456";
public static void main(String[] args) throws ToomanyErrorsException, NamePasswordMismatchException {
Scanner scanner = new Scanner(System.in);
int count = 0;
System.out.println("请输入用户名: ");
String username = scanner.next();
while (true) {
System.out.println("请输入密码: ");
String password = scanner.next();
if ("登录成功".equals(login(username, password))) {
System.out.println("登录成功");
break;
}
count++;
if (count==3){
throw new ToomanyErrorsException("密码输入次数已达上限!!!");
}
}
}
public static String login(String username, String password) throws NamePasswordMismatchException {
if (!Login.username.equals(username)) {
System.out.println("该用户名尚未注册,请核对后输入");
return "用户名有误";
} else {
if (!Login.password.equals(password)) {
try {
throw new NamePasswordMismatchException("密码输入有误");
} catch (Exception e) {
e.printStackTrace();
}
} else {
return "登录成功";
}
return "密码有误";
}
}
}