一、异常概念
异常是一种错误事件,它可能在程序执行期间发生并中断其正常流程。异常可能由不同类型的情况引起,例如用户输入的错误数据、硬件故障、网络连接故障等。
每当执行 java 语句时发生任何错误,都会创建一个异常对象,然后JRE 会尝试找到一个异常处理程序来处理该异常。如果找到合适的异常处理程序,则将异常对象传递给处理程序代码以处理异常,称为捕获异常。如果未找到处理程序,则应用程序向运行时环境抛出异常并且 JRE 终止程序。
Java 异常处理框架仅用于处理运行时错误,异常处理框架不处理编译时错误。
Throwable
是是 Java Exceptions Hierarchy 的父类,它有两个子对象 Error
和Exception
. 异常进一步分为检查异常和运行时异常。
- Error是超出应用范围且无法预测和恢复的异常情况,例如,硬件故障、JVM 崩溃或内存不足错误。
- 检查异常是我们可以在程序中预测并尝试从中恢复的异常情况,例如
FileNotFoundException
。我们应该捕获此异常并向用户提供有用的消息并正确记录它以进行调试。Exception
是所有检查异常的父类。 - 运行时异常是由错误的编程引起的,例如,试图从数组中检索元素。在尝试检索元素之前,我们应该首先检查数组的长度,否则它可能会
ArrayIndexOutOfBoundException
在运行时抛出RuntimeException
是所有运行时异常的父类。
二、异常处理关键字
1、throw:明确地想创建一个异常对象然后抛出它来停止程序的正常处理。
2、throws:在方法中抛出的异常没有处理时,需要在方法签名中使用throws关键字让程序知道该方法可能抛出的异常。可以提供多个异常
3、try…catch…:我们在代码中使用 try-catch 块进行异常处理。try 是块的开始,而 catch 是在 try 块的末尾以处理异常。我们可以有多个带有 try 的 catch 块,try-catch 块也可以嵌套。catch 块需要一个类型为 Exception 的参数。
4、finally:finally 块是可选的,只能与 try-catch 块一起使用。由于异常会停止执行过程,我们可能会打开一些不会关闭的资源,因此我们可以使用 finally 块。finally 块总是被执行,无论是否发生异常。
throws和throw区别
throws 关键字与方法签名一起使用以声明该方法可能抛出的异常,而 throw 关键字用于中断程序流程并将异常对象移交给运行时进行处理。
三、自定义异常
模拟做个登陆器
public class AbnormalTest {
private static String name = "小明"; // 账号
private static String pass = "666888"; // 密码
private static void loginException(String name, String pass) throws UserException, PassException {
if(!AbnormalTest.name.equals(name)) {
throw new UserException("用户名错误!");
}
if(!AbnormalTest.pass.equals(pass)) {
throw new PassException("密码错误!");
}
System.out.println("登陆成功!");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:>");
String name = scanner.nextLine();
System.out.print("请输入密码:>");
String age = scanner.nextLine();
try {
AbnormalTest.loginException(name, pass);
} catch (PassException e) {
e.printStackTrace();
} catch (UserException e) {
e.printStackTrace();
}
}
}
class UserException extends Exception {
public UserException(String message) {
super(message);
}
}
class PassException extends Exception {
public PassException(String message) {
super(message);
}
}
我们给账号和密码分别创建自定义异常类,他们都需要继承父类Exception
,然后写个带参数的构造方法,自定义异常可以有自己的变量和方法,我们可以使用它们将错误代码和异常信息传递给异常处理程序。最后在main方法中捕捉异常并输出。
printStackTrace
是throwable的一个方法,它将异常输出至标准错误流