Java异常体系及重点
1.什么是异常:
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常的分类:
所有的异常类是从 java.lang.Exception 类继承的子类。
Error 用来指示运行时环境发生的错误。
Exception又分为RunTimeException和其他Exception。
2.Java 异常的处理机制
Java的异常处理本质上是抛出异常和捕获异常。
cry-catch
try{
监控区域
}catch(Exception e){
//捕获异常
}
例如:
数组越界问题
public class test {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
try { //监控区域
System.out.println(arr[3]);//数组越界
} catch (ArrayIndexOutOfBoundsException e) { //捕获异常
System.out.println("你访问的数组下标不存在");
e.printStackTrace();//打印错误栈信息
} finally {//处理善后工作
System.out.println("请重新输入");
}
}
3.多重捕获块:
如果要捕获多个异常,从小到大开始捕获
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
4.throws/throw 关键字:
public void tryUser(String userName,String passWord) throws UserNameException {
if (!userName.equals(USER)) {
// 抛出用户名错误异常
throw new UserNameException("用户名错误!");//extends Exception
}
if (!passWord.equals(PASSWORD)) {
// 抛出密码错误异常
throw new PasswordException("密码错误!");//extends RuntimeException
}
}
1、throws出现在方法函数头;throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都只是抛出或者可能抛出异常,但不会去处理异常,真正的处理异常由函数的上层调用处理。
5.finally关键字:
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
6.RunTimeException和其他Exception:
受查异常:
除了非受查异常以外都是受查异常,如IOEcxception
非首查异常:
Error和RuntimeException及其子类
其他Exception:受查异常。可以理解为错误,必须要开发者解决以后才能编译通过,解决的方法有两种,
1:throw到上层,
2:try-catch处理。
RunTimeException:运行时异常,又称不受检查异常,不受检查。因为不受检查,所以在代码中可能会有RunTimeException时Java编译检查时不会告诉你有这个异常,但是在实际运行代码时则会暴露出来,比如经典的1/0,空指针等。如果不处理也会被Java自己处理。
7.自定义异常:
java支持自定义异常,以用户登录举例:
UserNameException:
继承Exception,需要添加异常到方法签名。
public class UserNameException extends Exception{
public UserNameException(String massage){
super(massage);
}
}
PasswordException:
继承RuntimeException,无需添加异常到方法签名,只在方法内抛出即可。
public class PasswordException extends RuntimeException{
public PasswordException(String massage){
super(massage);
}
}
自定义异常类:
public class User {
public static final String USER = "Yusean";
public static final String PASSWORD = "123456";
public void tryUser(String userName,String passWord) throws UserNameException {
if (!userName.equals(USER)) {
// 抛出用户名错误异常
throw new UserNameException("用户名错误!");
}
if (!passWord.equals(PASSWORD)) {
// 抛出密码错误异常
throw new PasswordException("密码错误!");
}
}
}
异常测试类:
public class UserTest {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入账号用户名:");
String userName = scanner.next();
System.out.println("请输入密码:");
String passWord = scanner.next();
User user = new User();
try{
user.tryUser(userName,passWord);
System.out.println("登录成功!");
}catch (UserNameException | PasswordException e){
e.printStackTrace();
}
}
}