【Java SE 】特殊报错机制 ---> 异常 !
欢迎各位点赞👍评论✍收藏⭐
目录
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;
@Override
protected 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. 小结
以上就是对异常机制的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持 !
原文地址:https://blog.csdn.net/Gao123456fy/article/details/143501477
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!