作者|繁荣的溪流贤若如
编辑责任|爱笑的河马
展出|csdn(id:csdnnews ) )。
在33558www.Sina.com/Java中,Java在编译、执行或执行过程中遇到的错误是个例外。
程序错误有三种:编译错误、运行时错误和逻辑错误
编译错误的原因是程序没有遵循语法规则。 编译器可以自己发现,并提示错误的原因和位置。 这也是初学者刚接触编程语言时经常遇到的问题。
运行时错误是因为程序在运行时发现了运行环境无法执行的操作。
逻辑错误是因为程序没有按照预期的逻辑顺序执行。 异常是指在程序执行过程中发生错误,异常处理是指处理和控制这些错误。
让我们看看代码。
packagecom.yichang; public class test { publicstaticvoidmain (string [ ] args ) system.out.println )1/0); //0不能是除数}}执行后的结果如下。
我注意到程序错误,但是图中的错误信息显示了两个信息。
发生了什么错误
错误位置
异常的简介
以上面的代码为例,如果程序在运行时运行main方法,然后运行到1/0,则程序会报告错误。 程序首先创建错误对象,以消除此错误对象。 我们知道我们的程序在Java虚拟机(JVM )上运行,程序丢失的错误对象将被JVM捕获。 当然,JVM在捕获到错误对象后,不知道该怎么办。 那个你不能做错误的调整。 JVM会打印错误信息。
总结:
上面的例子中出现的异常是运行时异常(异常是错误的)。
程序创建错误对象,然后抛出错误对象。 (投例外。 )
默认情况下,JVM捕获并打印错误消息(捕获异常) )。
异常产生的过程
首先,请看下面的代码。
packagecom.yichang; public class test { publicstaticvoidmain (string [ ] args ) system.out.println )1/0); //0除数System.out.println ('你好' ); }运行结果如下。
从上面的代码和运行结果可以看出,控制台上没有打印你好。 这是因为在JVM捕获异常后,程序将终止。 这意味着,在JVM处理错误时,程序此时将终止,因此无法执行异常和后续代码。 我们可以根据生活的实例来思考。 什么时候百度会因为找不到东西而停止服务,一定做不到。 因此,我们以后在JVM异常到达之前如何停止异常,自己单独处理,请不要给JVM添麻烦。
为什么不能直接让JVM获取异常
虽然上面的示例描述了程序创建错误对象,但是说到对象,我们知道对象是由类创建的。 该异常对象一定是由异常类创建的。 下图是Java提供的异常类。
从图中可以看到,Throwable是所有异常的根,所有异常类都是从Throwable继承的,就像面向对象的所有类都是从Object继承的一样。
我们来谈谈异常的分类:
运行时间扩展:时发生异常。 通常不手动处理,而是在出现问题后再处理。
其他Exception:必须手动处理。
Error:一般指系统级错误。
用生活例子说明这三个异常。 初学者容易理解。
假设我们现在开车上山。
开车时发现山上有很多小石头,但我们没能处理好所有的小石头。 这个时候,我们还在正常驾驶。 什么时候小石头弄坏了轮胎? 我们再下车换备用轮胎。 这就是运行时的异常
开车的时候我注意到前面有一块大石头挡住了路。 这个时候,你必须下车先移动这块石头才能继续爬山。 这也就是其他的表达式。
开车上山的过程中山塌了,你又处理不了。 在山好起来之前你必须继续出发。 也就是说是错误。 这样的错误是我们一般程序员无法处理的。
异常的分类
> 异常的处理方法try···catch处理
语法:
try{ //尝试执行的代码 }catch(Exception e){ //处理异常的代码 }finally{ //最终的}下面我将文中案例进行改造:
package com.yichang;public class Test { public static void main(String[] args) { try { System.out.println(1/0);//0不能做除数 }catch (Exception e){ e.printStackTrace();//打印错误信息,给程序员看的 System.out.println("系统出现错误,请联系管理员");//给客户看的 }finally { //一般做收尾工作 System.out.println("你好"); } }}运行结果为:
try-- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch-- 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally-- finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。
throws和throw处理throws表示方法准备要扔出来一个异常
throw表示向外抛出异常
举例说明:
package com.yichang;public class Test1 { public static void chu(int a,int b) throws Exception{ if (b==0){ throw new Exception("除数不能为0"); }else { System.out.println(a/b); } } public static void main(String[] args) throws Exception{ chu(1,0); }}运行结果:
以上这两种方法都是处理异常的,如果这个异常你可以处理,就用try···catch方法捕获并处理异常,如果这个异常你不能处理,就用throws方法抛出异常,但作为程序员的我们要始终记住一句话:产生的错误尽可能的自己处理,少向外抛出异常。
自定义异常
到这可能有的朋友要问了,为什么要自定义异常,Java给的那么多还不够用吗?我可以告诉你,当然不够用,比如在生活中,我们都知道外面的澡堂子里边是分男女澡堂的,如果有男顾客走进了女澡堂或有女顾客走进了男澡堂,就坏事了,这算是一个大异常吧,那大家想,jdk会给我们提供跟性别还有澡堂子有关的异常吗?肯定是不可能的,那此时就需要我们自定义异常。我以澡堂子为例,写一个程序,供大家参考。
自定义异常:直接继承Exception或者RuntimeException来是实现自定义异常
Person类
package com.yichang;public class Person { String name;//姓名 String gender;//性别 public Person(String name, String gender) { this.name = name; this.gender = gender; }}ZaoTangZi类
package com.yichang;public class ZaoTangZi { public void man(Person p) throws GenderException{ if (p.gender=="男"){ System.out.println("欢迎光临"); }else { //需要抛出一个异常 throw new GenderException("性别错误,这里是男澡堂子"); } }}GenderException类
package com.yichang;public class GenderException extends Exception{ //自己定义的异常必须要继承Exception或RuntimeException public GenderException(String msg){ super(msg);//调用父类的构造方法,Exception(msg) }}Test类
package com.yichang;public class Test { public static void main(String[] args) throws GenderException{ Person p1 = new Person("drdgz","男"); Person p2 = new Person("单薄的萝莉","女"); ZaoTangZi z = new ZaoTangZi(); z.man(p2); }}运行结果:
写到这,这篇异常处理的文章就写完了,看完后我们应该明白以下几个问题:
什么是异常
出现异常如何处理
如何自定义异常
可能写的有点啰嗦了,但对新手是友好的,还请大家多多包涵,希望能对大家有所帮助。
【END】
更多精彩推荐
☞同期两篇 Nature:运行温度高于 1K 的量子计算平台问世!
☞Libra 的 Move 语言初探,10 行代码实现你第一个智能合约
☞程序员:“我放弃了年薪 20 万的 Offer”
☞20万个法人、百万条银行账户信息,正在暗网兜售
☞以太坊2.0中的Custody Game及MPC实现
☞很用心的为你写了 9 道 MySQL 面试题,建议收藏!
你点的每个“在看”,我都认真当成了喜欢