一文让你秒懂Java的异常处理

Brigitte ·
更新时间:2024-09-20
· 693 次阅读

文章目录什么是异常,异常机制有什么用?UML错误和异常Java对异常的处理的两者方式异常对象的方法finally如何自定义异常类 什么是异常,异常机制有什么用?

程序发生不正常情况,即异常,java把异常信息打印到控制台,供程序员参考,程序员可以对程序进行修改,让程序更加健壮。

package ExceptionPcakage; public class ExceptionTest1 { public static void main(String[] args) { // TODO Auto-generated method stub int a=10,b=0,c=3; System.out.println(devide(a,b)); } public static int devide(int a,int b) { return a/b; } } Java中异常是以什么方式存在的?
异常是以类的形式存在。 当出现异常时,jvM虚拟机会自动new异常对象,并将异常对象抛出,因此我们能在控制台看到异常信息。 异常类在java.lang包下,所以不用导入类。 package ExceptionPcakage; public class ExceptionTest1 { public static void main(String[] args) { // 通过异常类“实例化”异常对象 int a=9,b=0; NumberFormatException fe =new NumberFormatException("数字格式化异常"); System.out.println(fe); } } UML

什么是UML?有什么用?
UML是一种统一建模语言。
一种图标式语言(画图的),UML不是只用java中使用,只要是面向对象的编程语言,都有UML.一般画UML图的都是软件架构师或者说是系统分析师,软件设计师,人员使用。

UML图就是一个设计图,可以描述类和类之间的关系,层序执行的流程,对象的状态等。就好比盖大楼一样,盖楼之前,会先由建筑师画图纸,图纸上的符号都是标准符号,只要是搞建筑的都能看懂,因为图纸上的标注是一种标准语言。 作为程序员,得看懂。 错误和异常

Object下有Throwable(可抛出异常)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理)

Exception下有两个分支:
编译时异常:(故名思议,必须预先对这些异常进行处理否则编译报错。
RuntimeException:运行时异常,在编写阶段可以不管可以处理。 两者都发在在运行阶段,编译阶段是不会发生得,因为只有运行阶段才可以new对象。
错误只要发生,java程序只有一个结果,终止程序得执行,退出JVM。错误是不能被处理的。 编译时异常(受检异常,受控异常)和运行时异常(非受检异常,非受控异常)的区别?
编译时异常发生得概率高。
例如:外面下雨,你出去,如果不打伞你可能会生病,而且发生得概率很高。所以我们需要再出门前带上伞。带伞就是预处理。
因此对于一些发生概率较高的异常,需要在运行之前对其进行预处理。 而运行时异常发生的概率低。
比如出门被飞机轮子砸到,对于这些概率较低得异常,不需要对其预处理。(如果预处理将活得很累)。 Java对异常的处理的两者方式 第一种:在方法声明的位置上,使用throws关键字,抛给了上一级。谁调用我就抛给谁。 第二种:使用try … catch语句进行异常的捕捉。谁也不知道,因为我抓住了。
例如:我是一个集团的销售员,因为失误造成公司损失了1000元。(看作是一个异常发生)
第一种方式:我把这件事告诉我的领导【异常上抛】
第二种方式:我自己掏腰包补上。【异常的捕捉】 思考:如果异常发生后,我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两者处理方式。 注意:java中异常发生后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了Jvm,jvm知道这个异常发生,终止程序的执行。 上抛等于推卸责任,抛给其调用者,捕捉是解决了问题。 我们主要处理编译异常。
在这里插入图片描述 可以抛异常的父类,因为父类包括其异常类,throws后面可以写多个异常。 我们只需要处理编译性异常即可,运行时异常不处理也可以。 catch(异常类型 参数名)的参数保存的时出现异常的对象地址。 catch执行完后,其后的代码可以执行,但try代码块异常行后的代码不会执行。 只要异常没有捕捉 ,采用上报的方式,此方法的后续代码不会执行,即方法结束,相当于return。 并且如果try语句块中 某一行代码出现异常,改代码后面的代码不会执行。 可以写多个catch(),其会自动选择,catch尽量类型错误尽量具体,子类的类型的catch不须写在父类前(从上到下,从小到大)。 jdk8中catch的异常类型可以用或(“|”)选择多个异常。 开发中如果想要调用者知道,就让调用者处理,根据实际情况选择处理方式。 异常对象的方法 getMassage()获取异常简单的描述信息。

在这里插入图片描述

printStackTrace() 打印异常追踪的堆栈信息。采用了异步线程的方式打印的。(打印异常信息,异步输出)
在这里插入图片描述
查看异常信息:sun写的就不用看,从上往下看自己写的。 thorw 手动抛异常。 finally 在finally子句最后执行的,并且一定会执行, 即使try语句块出现了异常,finally子句必须和try一起出现,不能单独书写。 流使用完要关闭,出现异常也要关闭。
在这里插入图片描述 try可以直接和finally连用,不用catch. try不能单独使用。 return执行方法结束,但就算try中有return,也会执行finally语句块,return最后执行。但退出jvm后finally的代码就不执行了,虽然finally充了钱,哈哈。 finally面试题
在这里插入图片描述
java中自上而下执行。返回100. final ,finally,finalize的区别
在这里插入图片描述 finalize是gc负责调用的。 如何自定义异常类 sun公司提供的JDK的内置异常肯定是不够的,在实际开发中,我们很多业务出现异常可能是JDK中没有的,这时我们需要自定义异常。 第一步:编写一个类继承EXception或者RuntimeException. 第二步:提供两个构造方法,一个无参数的,一个带有String参数的。 程序中哪里出现异常,就用thow 手动抛异常。
在这里插入图片描述 方法覆盖时,重写的方法不能比父类的方法抛出更多(更宽泛)的异常,可以更少。 小练习:
在这里插入图片描述
//主类 package Package1; import java.util.Scanner; public class ExceptionPractice1 { public static void main(String[] args) { UersService aa = new UersService(); Scanner Scan = new Scanner(System.in); System.out.println("请输入用户名:"); String Name = Scan.next(); System.out.println("请输入密码:"); String Code = Scan.next(); try { aa.register(Name,Code); } catch (MyException e) { e.printStackTrace(); } } }

//用户类

package Package1; public class UersService { private String AccountName; private String AccountNameCode; public UersService() { } public UersService(String accountName, String accountNameCode) { AccountName = accountName; AccountNameCode = accountNameCode; } public String getAccountName() { return AccountName; } public void setAccountName(String accountName) { AccountName = accountName; } public String getAccountNameCode() { return AccountNameCode; } public void setAccountNameCode(String accountNameCode) { AccountNameCode = accountNameCode; } // 注册 public void register(String a,String b)throws MyException{ if(a==null||a.length()>14||a.length()<4) throw new MyException("用户名请长度应为6到16"); else if(b.length()18) throw new MyException("密码长度应为6到18"); else System.out.println("登入成功!欢迎你:"+a); } } //自定义异常类 ```go package Package1; public class MyException extends Exception{ public MyException() { } public MyException(String message) { super(message); } }

在这里插入图片描述


作者:轻松玩编程



JAVA 异常 java的 异常处理

需要 登录 后方可回复, 如果你还没有账号请 注册新账号