🔥博客主页🔥:【 坊钰_CSDN博客 】
欢迎各位点赞👍评论✍收藏⭐
目录
1. 异常概念
1.1 算术异常
1.2. 空指针异常
1.3 数组越界异常
2. 异常的分类
2.1 编译时产生的异常
2.2 运行时产生的异常
3. 如何处理异常
3.1 异常的抛出
3.2 异常的声明
3.3 异常的捕获
4. 自定义异常
5. 小结
1. 异常概念
Java 中,简单来说,异常就是程序运行中发生的不正常行为,那么常见的异常有三种
1.1 算术异常
public class Test1 {public static void main(String[] args) {int tem = 10 / 0;System.out.println(tem);//报出下列异常//Exception in thread "main" java.lang.ArithmeticException: / by zero}
}
- 原因是:0 不能被作为除数
1.2. 空指针异常
public class Test1 {public static void main(String[] args) {String str = null;System.out.println(str.length());//报出下列异常//Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null}
}
- 原因是:空指针是不能用来引用的
1.3 数组越界异常
public class Test1 {public static void main(String[] args) {int[] arr = new int[5];System.out.println(arr[10]);//报出下列异常//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5}
}
- 原因是:数组访问越界
2. 异常的分类
在程序运行的过程中,根据发生的时机不同,异常可以分为两大类
2.1 编译时产生的异常
在程序编译时产生的异常,叫编译异常,也叫受查异常
class Student{public String name;public int age;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test1 {public static void main(String[] args){Student student = new Student();Student student1 = (Student) student.clone();//报出下列异常//java: 未报告的异常错误java.lang.CloneNotSupportedException; 必须对其进行捕获或声明以便抛出}
}
2.2 运行时产生的异常
运行异常(RunTimeException),顾名思义,是在运行时产生的异常,也叫非受查异常
上述常见的三种例子,都是运行时的异常:算术异常、数组越界异常、空指针异常
3. 如何处理异常
在 Java 中,我们处理异常时,常用的 5 个关键字 throw、try、catch、finally、throws
3.1 异常的抛出
在我们编写程序时,如果遇到错误时,可以将错误的信息抛出
我们用 throw 关键字来抛出一个指定的异常
throw new XXXXXException("原因");
例如:空指针异常抛出
public class Test1 {public static void fun(int[] arr) {if(arr == null) {throw new NullPointerException("为空指针,不能用来引用");}}public static void main(String[] args) {fun(null);}//报出我们抛出的异常//Exception in thread "main" java.lang.NullPointerException: 为空指针,不能用来引用
}
- throw 必须在方法的内部
- 抛出的对象必须是 Exception 或 Exception 的子类
- 如果抛出的为运行时异常,则我们不用处理
- 如果抛出的为编译时异常,则我们必须处理
- 抛出异常后,后面的代码不在运行
3.2 异常的声明
当方法中抛出编译异常时,我们不想处理该异常时,就可以借助 throws 关键字来声明该异常
当我们抛出编译时异常时,会报错
public class Test1 {public static void fun(int[] arr){if(arr == null) {//该异常为编译时异常throw new CloneNotSupportedException("为空指针,不能用来引用");}}
}
所以,用 throws 声明异常即可
public class Test1 {public static void fun(int[] arr) throws CloneNotSupportedException {if(arr == null) {//该异常为编译时异常throw new CloneNotSupportedException("为空指针,不能用来引用");}}
}
3.3 异常的捕获
throws 声明异常只是声明,并没有真正的处理异常,最后还是由使用者处理,而真正处理异常,我们要用到 try-catch 去进行捕获
try {//可能出现异常的代码
} catch(捕获的异常类型 e) {//对异常进行处理
} catch(捕获的异常类型 e) {//对异常进行处理
} finally {//该代码为一定执行的代码//不管什么情况下,一定一定会执行
}
public class Test1 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};try{System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("数组越界");} finally {System.out.println("finally 代码一定会执行!!!");}}
}
4. 自定义异常
当然,有些时候,Java 中的自带的异常并不能满足我们的需求,我们需要自定义一个异常来供自己使用
自定义异常的方式:
- 自定义一个类,然后继承与 Exception 或 RunTimeException
- 实现一个带 String 参数的构造方法,用来说明异常的原因
我们以用户输入 “账号” 和 ”密码“ 来举例,来自定义两个异常
- EnterAccountException 账号错误异常
- EnterPasswordException 密码错误异常
//密码错误异常
public class EnterPasswordException extends Exception{//无参构造方法EnterPasswordException() {}//String 参数构造方法EnterPasswordException(String mig) {super(mig);}
}
//账号错误异常
public class EnterAccountException extends Exception{//无参构造方法EnterAccountException() {}//String 参数构造方法EnterAccountException(String mig) {super(mig);}
}
登录代码
public class Login{private String account = "123456";private String passord = "888888";public void loginInfo(String userAccount,String userPassword) throws EnterAccountException,EnterPasswordException{if(!userAccount.equals(account)) {throw new EnterAccountException("账号输入错误!");}if(!userPassword.equals(passord)) {throw new EnterPasswordException("密码输入错误!");}System.out.println("输入正确,登录成功!");}
}
5. 小结
以上就是对异常机制的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持 !