`

异常与异常类

    博客分类:
  • j2se
 
阅读更多
第一.异常的概念:异常就是程序在运行中的错误,程序中的异常用异常类来描述。

第二:对异常的认识
1.异常是运行时错误,编译时错误不是异常
2.java中对异常的处理是用类来描述的,这种类称为异常类,描述程序运行时候的错误。
3.自定义异常:例如我定义一个类来描述异常WaterException(水灾类)
4.异常类能够继承父类:Throwable(异常类的父类)
5.Throwable的直接子类 是Error和Exception,所以Throwable是所有异常类的父类。而Throwable的父类是Object.
Error:程序没法处理的异常(也就是程序员无法控制的异常),例如程序运行时候电脑没电了,或者内存溢出(原因是自己电脑内存太小),也就是说程序运行的环境出问题了
Exception:程序能够合理的进行捕获的异常。
6.Exception又包含两种情况:运行时异常   和  检查异常(预防)
1).运行时异常:包含RuntimeException和他的子类,出现RuntimeException类型错误,可以修改程序中的代码,也可以处理,(方法一修改程序,方法二处理,两种方法选择其一)
2).检查异常:除了运行时异常之外的异常都是检查异常。如果产生了异常,必须处理,因此程序会有错误提示。处理有两种方式,一个是trycatch结构,一个是throws
异常有不确定性,异常我们对异常的处理也都是预防(如果发生了我们就怎么怎么办)
3).为什么检查异常必须处理呢?因为检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法
7.
1).java默认处理异常的方式:
jvm打印错误信息,程序中断(出现异常的时候,jvm自动产生一个该异常对应的异常类的对象,jvm捕获了这个异常,输出错误信息,程序中断)
2).自己处理异常(运行时异常):try catch:试图捕获异常,(这是预防性的),try里面的代码如果出现异常,这段代码会产生一个异常对象,这个异常对象在catch中匹配
3).自己处理异常(检查异常):检查异常必须处理,(看异常类是什么类型的,如果不是运行时异常就必须处理),检查异常两种处理方式:try catch和throws

第三:异常的代码分析:
1.异常的出现:此时产生异常类的对象并被jvm捕获,程序中断。
public class demo {
    public static void main(String[] args) {
Scanner input = new Scanner(System.in);//1,创建对象
System.out.println("请输入一个整数:");
//2.接收键盘输入的值,当输入的不是整数的时候,就会产生输入不匹配异常。遇到异常程序将会中断。这种中断是程序的默认处理方法,由java虚拟机jvm来处理
//java虚拟机怎么知道有异常?答:当程序执行中发生异常,将会产生异常对应的描述的类的对象,该对象会被虚拟机捕获掉,被虚拟机捕获后程序就中断了。因此需要程序员来捕获,不能让虚拟机来捕获
int x=input.nextInt();
System.out.println("x="+x);
}
}

2.分析try catch结构:是试图捕获的意思。
public class demo1 {
public static void main(String[] args) {
try{
Scanner input = new Scanner(System.in);
System.out.println("请输入一个整数:");
int x=input.nextInt();//当这里输入的不是整数的时候,会被catch捕获,去执行catch了。因此不会再执行try里面的内容了
System.out.println("x="+x);//这句话不会输出
System.out.println("哈哈哈哈哈哈");//这句话也不会输出
}catch(Exception ex){//Exception是个类,ex就是具体的对象,ex输出的结果就是类名:java.util.InputMismatchException
System.out.println(ex instanceof InputMismatchException);//返回ture。这里是父类引用子类的对象
System.out.println("发生类型不匹配异常"+ex);
}
   System.out.println("发生异常了");//这句话会被输出,这样保证了程序不会被中断、也就是说异常被处理之后程序就会继续执行
}

}

3.多重catch与finally
//多重catch
public static void main(String[] args) {
try{
Scanner input=new Scanner(System.in);
System.out.println("请输入第一个整数:");
int x=input.nextInt();
System.out.println("请输入第二个整数:");
int y=input.nextInt();
int z=x/y;//除0异常
System.out.println("z"+z);


int[] arr=new int[3];
System.out.println(arr[3]);//数组下标越界了


}catch(InputMismatchException ex){
System.out.println("发送类型不匹配异常,必须输入整数");
}catch(ArithmeticException ex){
System.out.println("除数不能为0异常");
}catch(Exception ex){//在此程序中,他将捕获ArrayIndexOutOfBoundsException异常,数组下标越界异常
//ex.printStackTrace();//打印异常信息,其实跟+ex差不多
System.out.println("如果有上面异常类不能捕获到的异常,我来进行捕获"+ex);
}finally{//有没有异常都会被执行。这个finally经常做的事情是资源的释放,例如关闭数据库连接等
System.out.println("这里的内容是最终都会被执行到的内容,不管是不是有异常都会执行到这个");
}
  
}


4.运行时异常:
//1.检查异常,必须要被处理(抛出或者捕获)。检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法(try或throws)。
//2.能出现红线和出现错误的处理方式的原因是系统已经把哪些东西是检查异常提前定义好了。
//throws:声明异常:告诉方法的调用者,该方法可能发生的异常。
//throw:抛出异常

public static void main(String[] args) {
/* try {
Class.forName("");//找不到这个类异常。检查异常必须要处理
} catch (ClassNotFoundException e) {
e.printStackTrace();
}*/
 
   //第一种情况:对运行时异常不捕获的情况
    div(10,0);//调用者没有对异常进行处理,因为div声明的异常是个运行时异常,程序员可以处理也可以不处理,程序员不处理的时候就会走系统默认的处理方式,也就是程序中断。
  
    //第二种情况:对运行时异常捕获的情况
    try{
    div(10,0);
    }catch(Exception ex){//这里这个异常对象就是下面的new ArithmeticException。因此这里输出传入实参有误java.lang.ArithmeticException: 你数学有问题
    System.out.println("传入实参有误"+ex);
    }
   }
   //throws声明该方法可能会发生ArithmeticException异常。会把异常给调用者,让调用者来处理
   public static void div(int x,int y) throws ArithmeticException{
if(y==0){//加了判断如果有错误提前进入异常
   //创建可能产生的异常对象。如果发生异常,本来是在int z=x/y的时候产生异常,现在我提前抛出异常。程序从这一行将会中断。
throw new ArithmeticException("你数学有问题");//这里输出:java.lang.ArithmeticException: 你数学有问题
}
   int z=x/y;
   System.out.println(z);
}


5.检查异常:调用者必须处理
public static void main(String[] args) {
//main方法调用了div方法,因此main方法需要对div的异常进行处理,处理方式有两种,一个是捕获异常trycatch,另一个是继续向上抛出异常throws
          try {
div(10,0);
} catch (Exception e) {
e.printStackTrace();
System.out.println("分母不能为0"+e);
}
}

//这个方法使用了throws对可能发生的异常进行了声明,但是声明的异常类是个Exception类型的,他是所有异常的父类,也就是说他包括检查异常和运行时异常

       //既然包含检查时异常,就要对异常进行捕获,因此需要调用者进行捕获,否则程序将会报错
public static void div(int x,int y) throws Exception{
  int z=x/y;
  System.out.println(z);
}

6.自定义异常:我自己创建了一个洪灾异常

public class WaterException extends Exception{
private int grade=0;//洪灾等级
     public WaterException(){//无参构造
     super("水漫金山....");//异常的具体描述
     this.grade=5;
     }
public WaterException(String msg,int grade){//构造函数
super(msg);//调用的是父类的方法
this.grade=grade;
}
  
    //重写父类的方法
    public void printStackTrace(){
    if(grade==5){
   
    //ex有两个方法:
    //super.getMessage();//得到的是汉字
    //super.getStackTrace();//打印的不是汉字
    System.out.println("WaterException"+super.getMessage());
    }else if(grade==10){
    ......
    }
    }
}

第四:常见的异常类:

ClassCastException:类型转换异常(在多肽的时候经常有类型转换)
InputMismatchException:输入不匹配异常(输入类型不匹配)
ArithmeticException:算数异常(比如说除数不能为0)
ArrayIndexOutOfBoundsException:数组下标越界异常

第五:总结
1.用try-catch直接去“处理”(捕获)异常
2,但是如果我不想去处理(捕获),那我就在我的方法名后面声明这个异常,具体怎么办交给调用者
3,调用者如果调用一个方法(这个方法含有运行时异常),如果这个被调用者声明的是一个运行时异常,调用者可以不“处理”该方法
4.如果调用者调用的一个方法(这个方法是检查异常),如果这个被调用者声明了一个检查异常,那么调用者必须对对该方法进行“处理”,(因为如果不处理,这里会报着错)
“处理”方式有两种,一个是继续抛异常,另一个是用try-catch语句去捕获这个可能出现的异常
5.对于程序员知道可能会发生异常的时候,用throw去抛出异常,抛出之后有具体的异常解释(如果不自己抛出,java虚拟机会给你抛出,但这种抛出不友好,一般人看不懂)。用throw抛出异常之后程序会中断


分享到:
评论

相关推荐

    钢桁架结构振动特性渐变分析工具

    钢桁架结构振动特性渐变分析工具

    数据库实战-收集一些常见的 MySQL 死锁案例.zip

    数据库实战-收集一些常见的 MySQL 死锁案例.zip 数据库实战-收集一些常见的 MySQL 死锁案例.zip 在工作过程中偶尔会遇到死锁问题,虽然这种问题遇到的概率不大,但每次遇到的时候要想彻底弄懂其原理并找到解决方案却并不容易。这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类汇总,试图通过死锁日志分析出每种死锁的原因,还原出死锁现场。 实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,还应该结合具体的业务代码,或者根据 binlog,理出每个事务执行的 SQL 语句。

    Android的移动应用与php服务器交互实例源码.rar

    Android的移动应用与php服务器交互实例源码.rar

    【滤波跟踪】基于matlab平方根容积卡尔曼滤波机器人手臂运动跟踪【含Matlab源码 4540期】.mp4

    Matlab研究室上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    计算BMI等一些关于热量和蛋白质摄入的小工具.zip

    蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

    IMG_20240520_180055.HEIC

    IMG_20240520_180055.HEIC

    基于java实现的智慧医院门诊管理系统项目源码+设计文档+实验报告+详细资料.zip

    基于java实现的智慧医院门诊管理系统项目源码+设计文档+实验报告+详细资料.zip

    JavaScript_网页复制工具,网页抓取预渲染和SEO提升.zip

    JavaScript

    batik-xml-1.7.jar

    Batik是为想使用svg格式图片来实现各种功能的应用程序和Applet提供的一个基于java的工具包

    node-v4.7.0-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v14.19.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v18.19.1-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JavaScript_DeFi开发人员路线图是一个精心策划的开发人员手册,其中包括DApps开发资源和参考的最佳工具列表.zip

    JavaScript

    node-v17.0.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    CoordinateData.java

    CoordinateData.java

    JavaScript_命令行工具自定义Spotify客户端支持Windows MacOS和Linux.zip

    JavaScript

    头歌c语言实验答案.rar

    头歌c语言实验答案

    ip.xdb 最新的,改进

    ip.xdb 最新的,改进

    字符串逆序及java代码实现

    字符串逆序及java代码实现

    基于微信小程序的小说实体书商城(源代码+论文+说明文档+PPT)-计算机专业精品毕业设计

    0基础可以根据说明文档进行项目部署的计算机专业精品毕业设计和课程设计,基于微信小程序的小说实体书商城(源代码+论文+说明文档+PPT)。 随着互联网技术和通讯技术的快速发展、成熟,两者最终结合到了一起,即移动互联网。移动互联网时代的到来,微信的普及,致使基于微信小程序的系统越来越多,因此,针对用户手机微信购买小说书籍方面的需求,特开发了本微信小程序小说实体书商城。 本微信小程序小说实体书商城采用微信开发者工具、MYSQL数据库,基于微信平台设计开发。微信小程序小说实体书商城主要实现了用户功能模块和管理员功能模块两大部分,用户通过微信平台可进行查询小说、购买小说等,管理员可通过系统后台可对系统进行全面管理。该微信小程序小说实体书商城具有操作简单,界面清晰,管理方便,功能完善等优势,具有很高的使用价值。 “操作简单,功能实用”这是本软件设计的核心理念,本系统力求创造最好的用户体验。

Global site tag (gtag.js) - Google Analytics