异常的定义:非正常的;不同于平常的异常现象。在编程中,发现了不正常的事情是异常。
异常的由来:问题也是现实生活中的事物,所以可以把所有的异常封装成对象,在报错的时候,自动调用,也就是对不正常情况进行描述后的对象体现。

严重的异常用Error类进行描述(一般不编写代码进行处理)//没救的病人
不严重的用Exception类进行描述(可以使用代码进行处理)//小感冒可以治疗
比如:

package unusually;class Demo{int mul(int x,int y) {return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();int m=a.mul(3, 0);System.out.print(a+"over");
}
}
/*
我们都知道,3/0是不行的,所以运行的时候,会报错。
错误如下:
Exception in thread "main" java.lang.ArithmeticException: / by zeroat k/unusually.Demo.mul(kkk.java:5)at k/unusually.kkk.main(kkk.java:11)
*/
这个错误就是把异常给你表示出来。

这个输出的错误就是异常。
无论Error还是Exception都有共性内容,比如不正常的信息,引发原因等。

Error和Exception都是类而且他们的父类是Throwable
异常的处理的模板:

try{
需要被检测的代码,try来检测代码。
}
catch(异常类 变量){
处理异常的代码(处理方式)
}
finally
{
一定会执行的语句。
}

气死我了,上代码:

package unusually;class Demo{int mul(int x,int y) {return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(Exception e) {System.out.println("报错啦");}finally {System.out.println("hello");}
}
}
输出:
报错啦
hello

来解释下程序怎么运行的,try先检验错误,等try检验到错误的时候就把错误抛出去,catch是抓住错误的,但是catch抓错误能力有限,只能抓catch(异常类 变量)这里异常类表示的异常,Exception类可以接收万能的Exception异常,然后就进行catch里面处理异常的代码。

下面介绍几个获取异常信息的操作:
先写个getMessage()(获取异常信息)

package unusually;class Demo{int mul(int x,int y) {return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(Exception e) {System.out.println(e.getMessage());//就在这里调用}finally {System.out.println("hello");}
}
}
输出:
/ by zero//这就是异常信息
hello

再写第二个,异常的toString()的用法,打印的时候即带着异常信息,也带着异常名字。
气死我了,上代码:

package unusually;class Demo{int mul(int x,int y) {return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(Exception e) {System.out.println(e.toString());//就在这里调用}finally {System.out.println("hello");}
}
}
输出:
java.lang.ArithmeticException: / by zero
hello

第三个方法是printStackTrace()这个函数直接打印出异常信息,异常名字,甚至有出错的地方
代码:

package unusually;class Demo{int mul(int x,int y) {return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(Exception e) {e.printStackTrace();//就在这里调用}finally {System.out.println("hello");}
}
}
输出:
java.lang.ArithmeticException: / by zero
helloat duotai/unusually.Demo.mul(kkk.java:5)at duotai/unusually.kkk.main(kkk.java:12)

学到这里咱们已经学回了,Java语言的异常类的使用。
那么咱们接着来看异常类的另一种书写形式:异常声明throws

package unusually;class Demo{int mul(int x,int y)  throws Exception{ //在功能上用throsw关键字声明该函数可能会出现问题return x/y;}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(Exception e) {System.out.println(e.getMessage());}finally {System.out.println("hello");}
}
}
输出:
/ by zero
hello

看上去虽然和之前的代码没区别,但是呢我举个例子你们就明白了,try-catch方式就像踢足球,直接射门,加上throws就像先接收别人的传球再射门一样。
这时候有人肯定问:咱们可不可以同时处理多种异常?(Exception太笼统,细分点更好)
气死我了,上代码:

package unusually;class Demo{int mul(int x,int y)  throws ArithmeticException,ArrayIndexOutOfBoundsException{ //在功能上用throws关键字声明该函数可能会出现问题int[] arr=new int[x];System.out.print(arr[x]);//角标超界return x/y;//除0}
}
public class kkk {public static void main(String[] args) {Demo a=new Demo();try {int m=a.mul(3, 0);System.out.println(a+"over");}catch(ArithmeticException e) {System.out.println("除0");}catch(ArrayIndexOutOfBoundsException e) {System.out.println("角标超界");}finally {System.out.println("hello");}
}
}
输出:
角标超界
hello

因为按照程序运行的步骤来看,咱们是先遇到角标超界的问题,所以先抛出和抓了角标超界的问题。可以在最后加一个Exception类,笼统的收集自己没有想到的异常。(这个放了catch的最下面)

因为有些异常问题java并没有对其进行封装对象,这就会出现很多问题。
那么这个异常可以自定义吗?我们现在就来尝试一下自定义异常:
(打个比方项目要求a变量不为0)

package unusually;class Demo extends Exception
{}
public class kkk {public static void main(String[] args) throws Demo {int a=0;if(a==0) throw new Demo();//手动抛异常
}
}
输出:Exception in thread "main" unusually.Demoat k/unusually.kkk.main(kkk.java:10)

这样手动抛出异常,可以抛出本来java没有定义但是项目需要的异常。
而且建立了个类继承异常类,可以改写一些方法,下面可以改写异常信息。

package unusually;class Demo extends Exception
{private String mes;Demo(String mes){this.mes=mes;}public String getMessage() {return mes+"被改写了";}}
public class kkk {public static void main(String[] args) throws Demo {int a=0;if(a==0) throw new Demo("出现了异常,");//手动抛异常
}
}
输出:
Exception in thread "main" unusually.Demo: 出现了异常,被改写了at k/unusually.kkk.main(kkk.java:17)

从这里我们可以看出异常结果被改写了。
千万要注意,自定义异常的前提是继承Exception这种异常类,才能改写。
因为他们的父类Throwable的体系独有的可抛性特点。只有Throwable的子类才有可抛性。

一天一个学废小技巧:
在异常类家族里有个异类,RuntimeException。
如果在函数内容抛出该异常,函数上可以不声明,一样通过。
如果在函数上声明了该异常,使用者可以不进行处理,编译一样通过。

比如:

package unusually;class Demo extends Exception
{private String mes;Demo(String mes){this.mes=mes;}public String getMessage() {return mes+"被改写了";}}
public class kkk {public static void main(String[] args)  {int a=0;if(a==0) throw new Demo("出现了异常,");//手动抛异常
}
}

这样肯定报错,因为在函数上没声明异常。程序不知道你这是什么异常。就会报错,但是RuntimeException是编译的时候不会被检测的异常。

package unusually;class Demo extends Exception
{private String mes;Demo(String mes){this.mes=mes;}public String getMessage() {return mes+"被改写了";}}
public class kkk {public static void main(String[] args)  {int a=0;if(a==0) throw new RuntimeException("出现了异常,");//手动抛异常
}
}
输出:
Exception in thread "main" java.lang.RuntimeException: 出现了异常,at k/unusually.kkk.main(kkk.java:17)

编译时不被检测的异常和被检测的异常(运行时)区别:

编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
————————————————
版权声明:本文为CSDN博主「程序员-缘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36877577/article/details/64905518

练习:重写异常类,使其输出的时候,在getMessage()函数的返回值里加入,使你报错的有关变量(比如报错原因是除数a=0;那就输出a,不要直接输出0)。

Java学习(四)异常相关推荐

  1. java学习四个月以来的想法

    java学习四个月以来的想法 ​ 从五月开始接触编程到现在差不多四个月了,其实我在2018年的时候就听别人介绍过编程,因为我自己学得是工科类专业,掌握一门编程语言对自己以后有好处,所以才在今年开始学习 ...

  2. Java学习四阶段-07 服务注册中心Nacos

    Nacos注册中心简介 背景分析 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系 ...

  3. Java学习四阶段-09 Sentinel限流熔断

    Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...

  4. Java学习四阶段-JUC并发包

    文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...

  5. 4.多态(Thinking in java学习四)

    多态 通过分离做什么和怎么做,从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序. ==多态存在的三个必要条件==: 要有继承 要有重写 父类引用指向子类对 ...

  6. Java学习之路5——面向对象(OOP)和异常机制

    教学视频来源链接 一.面向过程&&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考 ...

  7. int arr 13 java,java学习13 - 数组的定义、操作、异常、二维数组

    续java学习12: 1.数组,引用类型变量,保存数据实际是保存的数组的首地址 2.定义数组容器三要素,数据类型,大小(长度),数组名 3.数组的定义公式一:数据类型[] 数组名 = new 数据类型 ...

  8. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  9. java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)

    java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常.finally关键字(java 学习中的小记录) 参考文章: (1)java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常. ...

最新文章

  1. TestLink1.9.3测试用例:Excel转换XML工具一
  2. 持续集成之 Jenkins 钉钉通知(八)
  3. 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)
  4. (41)FPGA四种常用逻辑门(异或门)
  5. [转]tensorflow中的gather
  6. image 微信小程序flex_第三天学习微信小程序开发总结
  7. 如何做项目总结与汇报
  8. 必须了解的EXCEL常用函数都有哪些?【附动图详解】数据分析
  9. 易灵思FPGA-软件Efinity和Modelsim联仿设置
  10. ue4使用Niagara粒子实现下雨效果,使用蓝图调节雨量
  11. 静态ip设置失败解决办法
  12. uniapp , 微信小程序 图片加载时闪烁
  13. VMWare 文件格式详解 .VMX .VMSD .VMDK
  14. OSChina 周日乱弹 ——颜值和代码水平是正比
  15. 川土微电子|推出带隔离电源的双通道数字隔离器
  16. 图像处理的数学模型与高性能算法——介绍
  17. 多元函数带 Peano余项的Taylor公式的推广 (原创)
  18. 预测|2021软件测试职业发展趋势,附BAT、TMD入职指南!
  19. LED驱动电源有几种保护方式
  20. Exploit编写教程2:跳转的多种姿势

热门文章

  1. 应用交付工程师Troubleshooting经验分享2
  2. 简单易懂的softmax交叉熵损失函数求导
  3. 【暴力枚举】LeetCode 90. Subsets II
  4. 预处理: 主成分分析和白化
  5. Caffe编写Python layer
  6. 错误调试:failed to allocate 4.75G (5102921216 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
  7. document.ready和window.onload
  8. 《Applying Deep Learning to Answer Selection: A Study And an Open Task》文章理解小结
  9. 使用spark-shell从本地读取文件不成功的的操作。
  10. uoj #111. 【APIO2015】Jakarta Skyscrapers