Java SE(12)——异常(Exception)

[复制链接]
发表于 2025-9-7 13:44:32 | 显示全部楼层 |阅读模式
1.概念

在Java中,异常(Exception)是指程序在运行过程中发生的不正常情况
比方:

  • 算数异常(ArithmeticException)

  • 空指针异常(NullPointerException)

  • 数组越界异常(ArrayIndexOutOfBoundsException)

根据上述的异常信息可以看出:每个具体的异常都有一个类来进行描述
2.异常的体系


Throwable:是所有错误(Error)和异常(Exception)的父类。它有两个重要的子类:Error和Exception
Error:Error及其子类表现Java假造机(JVM)无法处理的严肃题目。这些错误通常是不可规复的,应用程序不应该尝试去捕获这些错误
Exception:Exception及其子类表现应用程序可以捕获和处理的题目。Exception又可以分为两大类:

  • 1.检查型异常(Checked Exception)
  • 2.非检查型异常(Unchecked Exception)
3.错误(Error)

下面是栈溢堕落误代码示例:
  1. public class Demo {
  2.     public void demo() {
  3.         demo();
  4.     }
  5.     public static void main(String[] args) {
  6.         Demo demo = new Demo();
  7.         demo.demo();
  8.     }
  9. }
复制代码
运行效果: Exception in thread "main" java.lang.StackOverflowError
在Java中,每次调用方法都会在假造机栈上为该方法开辟一个方法栈帧。上述代码中无限递归调用demo()方法就会无限地开辟方法栈帧。由于栈空间是有限的,以是就会抛出StackOverflowError错误。像这种错误一旦发生整个应用程序就会立即崩溃,唯一的解决办法就是从根源上修改代码
4.异常(Exception)

4.1 检查型异常(Checked Exception)

检查型异常在编译阶段就会被检查,编译器强制要求程序员处理这些异常,好比:CloneNotSupportedException,IOException等。如果程序中抛出了这些异常,必须利用throws进行声明大概利用try-catch进行处理

4.2 非检查型异常(Unchecked Exception)

非检查型异常在编译阶段不会被检查,是在运行时可能发生的异常,好比:ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException等。这些异常如果程序员不做处理,就会交给JVM进行处理

5.异常的处理

5.1 throw

throw关键字用来显式抛出一个异常
  1. public class Demo {
  2.     public static int function(int num){
  3.         if(num == 0){
  4.             throw new ArithmeticException();
  5.         }
  6.         return 10 / num;
  7.     }
  8.     public static void main(String[] args){
  9.         System.out.println(function(0));
  10.     }
  11. }
复制代码
5.2 throws

throws关键字用于方法署名中,声明该方法可能抛出的异常。它重要用于处理检查型异常(Checked
Exceptions),即那些在编译时必要被处理的异常。通过利用throws,方法可以声明它不处理某些异常,而是将异常的处理责任转达给调用该方法的代码

5.3 try-catch

try-catch答应程序员捕获并处理应用程序答应过程中可能出现的异常,从而防止程序因未处理的异常而中断
当程序中抛出非检查型异常时,如果程序员不参与解决,就会交由JVM来处理。当JVM处理异常时会中断当前应用程序
  1. public class Demo {
  2.     public static void function(int num){
  3.         if(num == 0){
  4.             throw new ArithmeticException();
  5.         }
  6.         System.out.println("程序继续执行");
  7.     }
  8.     public static void main(String[] args){
  9.         function(0);
  10.     }
  11. }
复制代码
运行效果:

利用try-catch处理该异常:
  1. public class Demo {
  2.     public static void function(int num){
  3.         if(num == 0){
  4.             throw new ArithmeticException();
  5.         }
  6.     }
  7.     public static void main(String[] args){
  8.         try {
  9.             function(0);
  10.         }catch (ArithmeticException e){
  11.             System.out.println("成功捕捉到该异常并处理");
  12.         }
  13.         System.out.println("程序继续执行");
  14.     }
  15. }
复制代码
运行效果:

留意:

  • 1.try块内抛出异常后的代码将不会被执行



  • 2.如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到JVM收到后中断程序——异常是按照类型来捕获



  • 3 try中可能会抛出多个差别的异常对象,则必须用多个catch来捕获——即多种异常,多次捕获



  • 4.如果异常之间具有父子关系,一定是子类异常在前catch父类异常在后catch,否则语法错误



  • 5.可以利用Exception来一次性捕获所有异常,实现一劳永逸(一般不推荐,不利于排查题目)
5.4 finally

finally是Java中异常处理机制的一部分,通常与try-catch块一起利用。无论try块中的代码是否抛出异常,finally块中的代码都会执行。在finally块中重要执行清理操纵,如释放资源、关闭文件或数据库连接等

6.自定义异常

虽然Java中已经内置了非常多的异常类,但不一定完全符实用户的需求,以是用户也可以自定义自己期望的异常
6.1 定义方式

如果希望自定义非检查型异常,可以继承自RuntimeException及其子类
  1. public class PasswordErrorException extends RuntimeException {
  2.     public PasswordErrorException() {
  3.         super();
  4.     }
  5.     public PasswordErrorException(String message) {
  6.         super(message);
  7.     }
  8. }
复制代码
如果希望自定义检查型异常,可以继承自IOException等检查型异常
  1. public class PasswordErrorException extends IOException {
  2.     public PasswordErrorException() {
  3.         super();
  4.     }
  5.     public PasswordErrorException(String message) {
  6.         super(message);
  7.     }
  8. }
复制代码
6.2 利用自定义异常来实现登录功能
  1. public class PasswordErrorException extends RuntimeException {
  2.     public PasswordErrorException() {
  3.         super();
  4.     }
  5.     public PasswordErrorException(String message) {
  6.         super(message);
  7.     }
  8. }
  9. public class UsernameErrorException extends RuntimeException{    public UsernameErrorException(String message){        super(message);    }    public UsernameErrorException(){        super();    }}public class Login {    public void login(String username, String password){        if(!"admin".equals(username) ){            throw new UsernameErrorException("用户名错误");        }        if(!"123456".equals(password)){            throw new PasswordErrorException("暗码错误");        }        System.out.println("登录成功");    }    public static void main(String[] args) {        Login login = new Login();        try {            login.login("admin", "123456");        }catch (UsernameErrorException | PasswordErrorException e){        //printStackTrace()方法可以打印出抛异常的具体位置            e.printStackTrace();        }        System.out.println("程序继续执行");    }}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表