Day18

tech2022-08-02  137

1.异常的作用:增强程序健壮性。

自定义异常的两个要素: *1.继承Exception或RuntimeException, *2.无参构造、有参构造方法 class InputException extends Exception{ /***编译时异常**/ public InputException() { } public InputException(String str) { super(str); } }

2.java中异常以类和对象的形式存在。

2.1、异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的?
1.Object 2.Object下有Throwable(可抛出的) 3.Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的) 4.Exception下有两个分支: 5.1.Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。5.2.RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

3.编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。

编译时异常因为什么而得名? 因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。 所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。 因为异常的发生就是new异常对象。
再次强调:所有异常都是发生在运行阶段的。

4.编译时异常和运行时异常的区别?

4.1.编译时异常一般发生的概率比较高。
举个例子: 你看到外面下雨了,倾盆大雨的。 你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。 而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。 “拿一把伞”就是对“生病异常”发生之前的一种处理方式。

对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

4.2.运行时异常一般发生的概率比较低。
举个例子: 小明走在大街上,可能会被天上的飞机轮子砸到。 被飞机轮子砸到也算一种异常。 但是这种异常发生概率较低。 在出门之前你没必要提前对这种发生概率较低的异常进行预处理。 如果你预处理这种异常,你将活的很累。
4.3.java中如果没有分为:编译时异常和运行时异常,会怎么样?
首先,如果这样的话,程序肯定是绝对的安全的。 但是程序员编写程序太累,代码到处都是处理异常 的代码。
4.4.“编译时异常”还有其他名字:
受检异常:CheckedException受控异常
4.5.“运行时异常”还有其它名字:
未受检异常:UnCheckedException非受控异常
5.Java语言中对异常的处理包括两种方式:

5.1.在方法声明的位置上,使用throws关键字,抛给上一级。谁调用我,我就抛给谁。抛给上一级。

5.2.使用try…catch语句进行异常的捕捉。这件事发生了,谁也不知道,因为我给抓住了。

被catch捕捉后,不耽误下边的程序执行

举个例子:

我是某集团的一个销售员,因为我的失误,导致公司损失了1000元, “损失1000元”这可以看做是一个异常发生了。我有两种处理方式, 第一种方式:我把这件事告诉我的领导【异常上抛】 第二种方式:我自己掏腰包把这个钱补上。【异常的捕捉】 张三 --> 李四 ---> 王五 --> CEO

思考:

异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要 对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

6.注意:

Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。

7.

finally关键字,它后边的语句块要跟try、try…catch连用,不管他前边的try、try…catch语句块有没有return,finally一定会执行。 执行结果: 出现该结果的原因离不开两大亘古不变的原因:

1.方法体中代码自上而下执行;2.return一旦执行方法结束。 class Finally{ public static void main(String[] args) { System.out.println("returni()输出:"+returni()); } static int returni(){ int i=100; try { return i; /**此处return不影响finally的执行*/ }finally { i++; System.out.println("finally输出:"+i); } } }

8.方法重写/重载

子类不可以比父类抛出更多\更宽泛的异常, 可以更少\更小范围。

9.案例程序

/*** *编写程序模拟用户注册

1.程序开始执行时,提示用户输入“用户名”、“密码”2.输入信息后,后台java程序模拟用户注册3.注册时要求用户名长度在6~14,小于或者大于均显示异常。*/ import java.util.Scanner; public class UserLogin { public static void main(String[] args) { System.out.println("请输入用户名……(6~14位)"); Scanner input =new Scanner(System.in); String userName=input.next(); System.out.println("请输入密码……(6~14位)"); Scanner input2 =new Scanner(System.in); String password=input2.next(); UserRegister user=new UserRegister(); try { user.userRegName(userName); user.userRegPassword(password); } catch (InputException e) { e.printStackTrace();/***输出异常信息*/ System.out.println("注册失败"); } } } class UserRegister{ /***用户名验证****/ public void userRegName(String userName) throws InputException { if(userName==null ||userName.length()<6 || userName.length()>14){ throw new InputException("用户名输入长度异常"); /***下边不再执行**/ } System.out.println("用户名:"+userName+",符合要求"); } /*****密码验证*****/ public void userRegPassword(String password) throws InputException { // if(password==null || password.length()<6 || password.length()>14){ if(null==password || password.length()<6 || password.length()>14){ throw new InputException("密码输入长度异常"); /***下边不再执行**/ } System.out.println("密码符合要求"); } } /****自定义异常的两个要素:1.继承Exception或RuntimeException,2.无参构造、有参构造方法****/ class InputException extends Exception{ public InputException() { } public InputException(String str) { super(str); } }
最新回复(0)