一、实验预热
1、请解释编译时异常和运行时异常的区别,并举出几个常见的编译时异常和运行时异常
1)编译时异常是在编写程序是就会发现的异常,例如:IOException、FileNotFoundException、SQLException、NoSuchMethodException、ClassNotFoundException
2)运行时异常是程序在运行期间发现的异常,例如:ArrayIndexOutOfBoundsException、ArithmeticException、IllegalArgumentException、ClassCastException、NumberFormatException、NullPointerException
2、请说出throw和throws的区别
Throw是抛出异常实例化对象(一定抛出异常)
Throws是抛出异常声明(可能抛出异常)
二、实验内容
1、自行完成一个简单的自定义异常并处理,使程序正确执行,并获得异常返回信息。
代码:
package leif.tests;
public class ExperimentalReport {
public static void main(String[] args) {
try {
throw new ServiceException("ServiceException");
} catch (ServiceException serviceException) {
System.out.println(serviceException.getMessage());
System.out.println(serviceException.getServiceExceptionMessage());
serviceException.printStackTrace();
}
}
}
class ServiceException extends Exception {
private static final long serialVersionUID = 1L;
private String serviceExceptionMessage;
public ServiceException(String serviceExceptionMessage) {
super("Exception");
this.serviceExceptionMessage = serviceExceptionMessage;
}
public String getServiceExceptionMessage() {
return serviceExceptionMessage;
}
public void setServiceExceptionMessage(String serviceExceptionMessage) {
this.serviceExceptionMessage = serviceExceptionMessage;
}
}
结果截图:
image.png
2、在程序中实现两个数字求商的功能,当除数为0时,正确使用try-catch-finally捕捉如图所示的程序异常。
image.png
代码:
package leif.tests;
import java.util.Scanner;
public class ExperimentalReport {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入被除数:");
int dividend = scanner.nextInt();
System.out.print("请输入除数:");
int divisor = scanner.nextInt();
try {
if (!isInterger(dividend) || !isInterger(divisor) || isZero(divisor)) {
throw new ArithmeticException("出现错误:被除数和除数必须是整数,且除数不能为零。");
}
System.out.println(dividend / divisor);
} catch (ArithmeticException arithmeticException) {
arithmeticException.printStackTrace();
} finally {
scanner.close();
}
}
public static boolean isInterger(Object object) {
if (object instanceof Integer) {
return true;
} else {
return false;
}
}
public static boolean isZero(int i) {
if (i == 0) {
return true;
} else {
return false;
}
}
}
结果截图:
image.png
3、在程序中编写方法实现计算两数的商,该方法使用throws声明异常,在该方法的调用处使用try-catch-finally进行异常捕捉。
代码:
package leif.tests;
import java.util.Scanner;
public class ExperimentalReport {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入被除数:");
int dividend = scanner.nextInt();
System.out.print("请输入除数:");
int divisor = scanner.nextInt();
try {
getResult(dividend, divisor);
} catch (ArithmeticException arithmeticException) {
arithmeticException.printStackTrace();
} finally {
scanner.close();
}
}
public static int getResult(int dividend, int divisor) throws ArithmeticException {
return dividend / divisor;
}
}
结果截图:
image.png
4、正确使用throw抛出异常,实现当输入的性别不是“男”或“女”时,显示如下图所示的程序异常效果。
image.png
代码:
package leif.tests;
import java.util.Scanner;
public class ExperimentalReport {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入性别:");
String gender = scanner.next();
try {
if (!"男".equals(gender) && !"女".equals(gender)) {
throw new Exception("性别必须是“男”或“女”!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
scanner.close();
}
}
}
结果截图:
image.png