异常-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();
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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix