异常-RuntimeException

异常处理机制

  • 1、java中异常的作用是:增强程序健壮性。
  • 2、java中异常以类和对象的形式存在

java的异常继承结构:

  • Object下有Throwable(可抛出的)
  • Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
  • Exception下有两个分支:
  • Exception的直接子类:编译时异常:要求在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错。
  • 编译时异常也叫做:受检异常:CheckedException 受控异常
  • RuntimeException:运行时异常。运行时异常也叫做: 未受检异常:UnCheckedException 非受控异常
  • 编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
  • 编译时异常因为什么而得名? 因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
  • 所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。 因为异常的发生就是new异常对象。

Java语言中对异常的处理包括两种方式:

  • 第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。 谁调用,抛给谁。
  • 第二种方式:使用try..catch语句进行异常的捕捉。
  • 注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续 向上抛,抛给了调用者JVM,
  • JVM知道这个异常发生,只有一个结果。终止java程序的执行。

try{ }catch(){}

  • catch后面的小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型。
  • catch可以写多个。建议catch的时候,精确的一个一个处理。这样有利于程序的调试。catch写多个的时候,从上到下,必须遵守从小到大。

异常对象有两个非常重要的方法:

  • 获取异常简单的描述信息:    String msg = exception.getMessage();
  • 打印异常追踪的堆栈信息:    exception.printStackTrace();

关于try..catch中的finally子句:

  • 在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常
  • finally子句必须和try一起出现,不能单独编写。
  • try和finally,没有catch可以吗?可以。 try不能单独使用。 try{ } finally{ }可以联合使用。

finally语句通常使用在哪些情况下呢?

  • 通常在finally语句块中完成资源的释放/关闭。 因为finally中的代码比较有保障。即使try语句块中的代码出现异常,finally中代码也会正常执行。
复制代码
/*
finally题:
 java语法规则(有一些规则是不能破坏的,一旦这么说了,就必须这么做!):
        java中有一条这样的规则:
            方法体中的代码必须遵循自上而下顺序依次逐行执行(亘古不变的语法!)
        java中还有一条语法规则:
            return语句一旦执行,整个方法必须结束(return一定是最后执行的)
 */
public class ExceptionTest13 {
    public static void main(String[] args) {
        int result = m();
        System.out.println(result); //100
    }
    public static int m(){
        int i = 100;
        try {
            // 这行代码出现在int i = 100;的下面,所以最终结果必须是返回100
            // return语句还必须保证是最后执行的。一旦执行,整个方法结束。
            return i;
        } finally {
            i++;
        }
    }
}
复制代码

2、Java中怎么自定义异常呢?
    两步:
        第一步:编写一个类继承Exception或者RuntimeException.
        第二步:提供两个构造方法,一个无参数的,一个带有String参数的。

public class MyException extends RuntimException{ // 编译时异常
    public MyException(){

    }
    public MyException(String s){
        super(s);
    }
}

模拟用户注册:

1、程序开始时提醒用户输入”用户名“和”密码信息“

2、输入信息之后,后台java模拟用户注册

3、注册时要求用户名【4-16】之间,其他情况抛出异常

4、编写main方法接受用户输入注册信息

复制代码
/*
用户业务类,处理用户相关的业务:例如登录、注册等功能。
 */
public class UserService {

    /**
     * 用户注册
     * @param username 用户名
     * @param password 密码
     * @throws IllegalNameException 当用户名为null,或者用户名长度小于6,或者长度大于14,会出现该异常!
     */
    public void register(String username, String password) throws IllegalNameException {
        /*
        username == null 不如写成 null == username
        "abc".equals(username) 比 username.equals("abc") 好。
         */
        /*if(null == username || username.length() < 6 || username.length() > 14){
        }*/

        if(null == username || username.length() < 6 || username.length() > 14) {
            /*System.out.println("用户名不合法,长度必须在[6-14]之间");
            return;*/
            throw new IllegalNameException("用户名不合法,长度必须在[6-14]之间");
        }
        // 程序能够执行到此处说明,用户名合法
        System.out.println("注册成功,欢迎["+username+"]");
    }
}



复制代码
/**
 * 自定义异常
 */
public class IllegalNameException extends Exception {
    public IllegalNameException(){

    }
    public IllegalNameException(String s){
        super(s);
    }
}
复制代码

复制代码
public class Test {
    public static void main(String[] args) {
        // 创建UserService对象
        UserService userService = new UserService();
        // 用户名和密码就不再从控制台接收了
        try {
            userService.register("jack", "123");
        } catch (IllegalNameException e) {
            //System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
复制代码
复制代码

 

posted @   280887072  阅读(206)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示