概述
异常:就是不正常。异常情形是指阻止当前方法或者作用域继续执行的问题。有些是可以处理的,有些不能。包含异常名字、异常、线程位置信息等,包装成异常对象。
程序处理异常的步骤:程序出现不正常也就是异常情况时,它先new一个异常对象,然后在异常的位置终止程序,并在当前环境中抛出该异常的引用,异常机制接管程序,并开始寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序,它的任务就是将程序从错误状态恢复,以使程序要么换一种方法执行,要么继续执行下去。
--------java.lang.Throwable:
Throwable:可抛出的。
|--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|–Exception:异常,可以有针对性的处理方式,又分为CheckedException(编译时异常)和UncheckedException(运行时异常)。
1、无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名。
2、这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。
3、可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
4、在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。
5、如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名…
6、这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。
7、若程序中显示的声明了某个异常,则抛出异常时不会显示出处,若程序中没有显示的声明某个异常,当抛出异常时,系统会显示异常的出处。
处理方式有两种:1、捕捉;2、抛出。
对于捕捉:java有针对性的语句块进行处理
try {
需要被检测的代码;
}
catch(异常类 变量名){
异常处理代码;
}
fianlly{
一定会执行的代码;
}
--------------------------------------------------------
catch (Exception e) { //e用于接收try检测到的异常对象。
System.out.println("message:"+e.getMessage());//获取的是异常的信息。
System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。
e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。
}
异常处理原则:
1、功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
2、特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
3、通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
throw 和throws关键字的区别:
1、throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
2、throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。
异常分两种:
1:编译时被检查的异常,只要是Exception及其子类的都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。
3、定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
编译时被检查的异常和运行时异常的区别:
1、编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
2、声明的原因:是需要调用者对该异常进行处理。
3、运行时异常如果在函数内被抛出,在函数上不需要声明。
4、不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。(空指针异常、数组下标越界异常、类型转换异常、算术异常)
自定义异常:
当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
3、异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。
try catch finally结合方式:
try{
}catch{
}finally {
}
这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try finally集合只为关闭资源。
记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种情况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
3、如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
4、如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样子类的方法上是不需要throws声明的。
异常链:相当于一个方法调用另一个方法时,这另一个方法在调用一个方法,出现底层方法异常throws抛出到上一级,如果不能处理,抛出另一个新异常,这样异常信息可能丢失,所以在Throwable及其子类中的构造器中都可以接受一个cause参数,该参数保存了原有的异常信息,通过getCause()就可以获取该原始异常信息。
public void test() throws XxxException{
try {
//do something:可能抛出异常信息的代码块
} catch (Exception e) {
throw new XxxException(e);
}
}
public class Test {
public void f() throws MyException{
try {
FileReader reader = new FileReader("G:\myfile\struts.txt");
Scanner in = new Scanner(reader);
System.out.println(in.next());
} catch (FileNotFoundException e) {
//e 保存异常信息
throw new MyException("文件没有找到--01",e);//第二个参数e就是Trowable的构造器参数cause,存储本异常的信息
}
}
public void g() throws MyException{
try {
f();
} catch (MyException e) {
//e 保存异常信息
throw new MyException("文件没有找到--02",e);
}
}
public static void main(String[] args) {
Test t = new Test();
try {
t.g();
} catch (MyException e) {
e.printStackTrace();
}
}
}
结果:
com.test9.MyException: 文件没有找到--02
at com.test9.Test.g(Test.java:31)
at com.test9.Test.main(Test.java:38)
Caused by: com.test9.MyException: 文件没有找到--01
at com.test9.Test.f(Test.java:22)
at com.test9.Test.g(Test.java:28)
... 1 more
Caused by: java.io.FileNotFoundException: G:myfilestruts.txt (系统找不到指定的路径。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at java.io.FileReader.<init>(FileReader.java:41)
at com.test9.Test.f(Test.java:17)
... 2 more
案例二:毕老师用电脑讲课。
两个对象:
老师:
属性:姓名。
行为:讲课。
电脑:
行为:运行。
考虑问题。
1,电脑蓝屏-->异常。
2,电脑冒烟-->异常。
// 可以声明,让调用给出处理方式。
class LanPingException extends Exception
{
LanPingException()
{
super();
}
LanPingException(String message)
{
super(message);
}
}
class MaoYanException extends Exception
{
MaoYanException()
{
super();
}
MaoYanException(String message)
{
super(message);
}
}
/*讲课中冒烟,问题可以临时解决,是冒烟问题没有直接处理,所以就使用throws声明。
但是发现,这个问题不应该属于讲课的问题。调用讲课方法的调用者是处理不了这个冒烟问题的。
该调用者能处理的应该是冒烟导致的课程进行不下去的问题。
应该在列出一个异常。课时停止异常。*/
class NoPlanException extends Exception
{
NoPlanException()
{
super();
}
NoPlanException(String message)
{
super(message);
}
}
class NoteBook
{
private int state = 2;
public void run()throws LanPingException,MaoYanException//方法上可以通过throws声明多个异常。
{
System.out.println("笔记本电脑运行");
if(state == 1)
throw new LanPingException("电脑蓝屏了");
if(state == 2)
throw new MaoYanException("电脑冒烟了");
}
public void reset()
{
state = 0;
System.out.println("电脑重启");
}
}
class Teacher
{
private String name;
private NoteBook book;
Teacher(String name)
{
this.name = name;
book = new NoteBook();
}
//讲课。
public void prelect()throws NoPlanException
{
/*
调用到了声明异常的方法,在这里到底是捕获好呢?还是声明好呢?
有具体的捕获处理方式吗?有,那就捕获,没有,那么声明。
我可以处理,重启就可以了,重启是电脑的功能。
*/
try
{
book.run();//对于声明多个异常的方法,在处理,需要定义多个catch与之对应。
}
catch (LanPingException e)//LanPingException e = new LanPingException("电脑蓝屏了");
{
//重启。
System.out.println(e.toString());//异常的名称+异常的信息。
// e.printStackTrace();
book.reset();
}
catch(MaoYanException e)//MaoYanException e = new MaoYanException("电脑冒烟了");
{
System.out.println(e.toString());
test();
//冒烟问题没有解决,继续声明throws出去。
// throw e;
// new 电脑维修部(book);//去修电脑。
// book = new NoteBook();
throw new NoPlanException(e.getMessage()+",课时停止");//异常转换。
}
System.out.println(name+"....讲课");
}
//留练习。
public void test()
{
System.out.println("做练习");
}
}
class ExceptionTest2
{
public static void main(String[] args)
{
Teacher t = new Teacher("毕老师");
try
{
t.prelect();
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("换老师");
}
System.out.println("Hello World!");
}
}
参考大神的异常
异常二
JAVA基础——异常详解
最后
以上就是沉默小土豆为你收集整理的第九章 异常的全部内容,希望文章能够帮你解决第九章 异常所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复