概述
目录
概述
java.lang.Throwable
自定义异常
概述
程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。
出现的问题有很多种,比如数组下标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。
java.lang.Throwable
Throwable: 可抛出的。
|————Error 错误, 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略,通常是jvm发生的,需要对程序进行修正。
例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
|————Exception 异常,可以有针对性的处理方式
无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名。
这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。
可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
在开发时,如果定义功能时,发现该功能有一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。
如何标识呢?
通过throws关键字,格式: throws 异常类名。。。,这样标识后,调用者,在使用该功能时候,就必须处理,否则编译失败。
处理方式有两种:捕捉、抛出
对于捕捉:有针对性的语句进行处理。
try{
需要被检测的代码;
}catch ( 异常类 变量名){
异常处理代码;
}finally{
一定会执行的代码;
}
catch( Exception e){ //e用于接收try 检测到异常对象。
System.out.printIn("message:"+e.getMessage()); //获取异常的信息。
System.out.printIn("toString:"+e.toString()); //获取异常的名字+异常信息。
e.getMessage(); //打印异常在堆栈中信息;异常名称+异常信息+异常位置。
}
异常处理原则:功能抛出几个异常, 功能调用如果进行try处理,需要之对应的catch处理代码块,这样处理有针对性,抛几个处理几个。
throw和throws关键字区别
throw用于抛出异常对象,后面跟的异常对象;throw用在函数内。
throws用户抛出异常类,后面跟异常类名,可以跟多个,用逗号隔开,throws用在函数上。
异常分两种
1.编译时被检查的异常,只要是Exception及其子类的都是编译时被检查的异常。
异常 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
IllegalAccessException | 访问类被拒绝 |
InstantiationException | 试图创建抽象类或接口的对象 |
InterruptedException | 线程被另一个线程中断 |
NoSuchFieldException | 请求的域不存在 |
NoSuchMethodException | 请求的方法不存在 |
ReflectiveOperationException | 与反射有关的异常的超类 |
2. 运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常编译时不被检查的异常
异常 | 描述 |
---|---|
NullPointerException | 尝试访问 null 对象成员,空指针异常 |
NumberFormatException | 数字转化格式异常,比如字符串到 float 型数字的转换无效 |
ClassCastException | 类型转换异常 |
ArraylndexOutOfBoundException | 数组索引越界 |
TypeNotPresentException | 类型未找到 |
ClassCastException | 类型转换异常 |
ArithmeticException | 算术错误异常,如以零做除数 |
ArraylndexOutOfBoundException | 数组索引越界 |
IndexOutOfBoundsException | 某种类型的索引越界 |
编译时被检查的异常和运行时异常的区别:
编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
自定义异常
当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。
try catch finally的几种结合方式:
1,
try
catch
finally
2,
try
catch
3,
try
finally
这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try finally集合只为关闭资源。
记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种情况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
常见异常:
1、下标越界异常(IndexOutOfBoundsException)包括数组、字符串;
空指针异常(NullPointerException)
2、类型转换异常:ClassCastException
3、没有这个元素异常:NullPointerException
4、不支持操作异常;
异常要尽量避免,如果避免不了,需要预先给出处理方式。比如家庭备药,比如灭火器。
最后
以上就是无聊电灯胆为你收集整理的java必备基础2(异 常)概述的全部内容,希望文章能够帮你解决java必备基础2(异 常)概述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复