黑马程序员济南校区java基础:异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马程序员济南校区java基础:异常相关的知识,希望对你有一定的参考价值。

Exception:

Java运行时期发生的问题就是异常。

Java中运行时发生的除了异常Exception还有错误Error。

异常:通常发生可以有针对性的处理方式的。

错误:通常发生后不会有针对性的处理方式。

Error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。

无法针对处理,只能修正代码。

在编写程序时,必须要考虑程序的问题情况。所以定义定义程序需要考虑程序的健壮性。加入一些逻辑性的判断。

异常体系的特点:

异常体系中的所有类及其子类对象都具备可抛性。也就是说可以被throw和throws关键字所操作。

main方法是如何处理异常的。

    A:在main里面编写代码进行处理

    B:交给jvm自己进行处理。采用的是jvm的默认处理方式。

      其实就是相当于调用了异常对象的printStackTrace()方法。

Throwable类的学习

    getMessage():获取异常信息,返回字符串。

    toString():获取异常类名和异常信息,返回字符串。

    printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

异常应用:

if(arr==null) //空指针抛出异常

{

    thrownewNullPointerException("arr指向的数组不存在");

}

if(index<0|| index>=arr.length) // 角标越界抛出异常

{

    thrownewArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在");

}

if(age<0|| age>200) //无效参数抛出异常

{

    thrownewIllegalArgumentException(age+",年龄数值非法");

}

自定义异常:

自定义异常被抛出,必须是继承Throwable,或者继承Throwable的子类。该对象才可以被throw抛出,

可以将自定义的异常继承RuntimeException.在java虚拟机运行时异常以及其子类都无需进行声明

classNoAgeException extendsRuntimeException

  {

      /*

      为什么要定义构造函数,因为看到Java中的异常描述类中有提供对问题对象的初始化方法。

      */

      NoAgeException()

      {

          super();

      }

      NoAgeException(String message)

      {

          super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。

      }

  }

原理异常分两种:

1,编译时异常(Java.lang.Excpetion):编译器会检测的异常。jvm认为程序本身有问题要进行声明或者捕获。

2,运行时异常(Java.lang.RuntimeExcpetion):编译器不会检测的异常。不需要声明。声明也可以,如果声明了,无外乎就是让调用者给出处理方式。

继承Exception和继承RuntimeExcpetion的区别:

Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

//(该程序已经出现问题,Java认为这个程序本身存在隐患,需要捕获或者声明出来)

RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。

可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。

//(异常不是功能本身造成,而是用户在使用功能的时传递参数错误而导致功能运行失败。)

继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。

但是如果使用到了对象的数据,导致都失败的。

继承RuntimeExcpetion,不需要throws声明的,这时调用是不可能编写捕获代码的,因为调用根本就不知道有问题。

一旦发生异常,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码。在用throws抛出一个的时候,如果这个异常是属于RuntimeException的体系的时候,我们在调用的地方可以不用处理。(RuntimeException和RuntimeException的子类)

声明:将问题标识出来,报告给调用者。如果函数内通过throw抛出了编译时异常,而捕获,那么必须通过throws进行声明,让调用者去处理。

捕获:Java中对异常有针对性的语句进行捕获。

语句:

try

{

//需要被检测的语句。

}

catch(异常类 变量)//参数。

{

//异常的处理语句。

}

finally

{

//一定会被执行的语句,并且在return之前运行。

}

try catch : 对代码进行异常检测,并对检测的异常传递给catch处理。

try finally : 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。

异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所以finally。只为关闭资源。

try catch finally:检测异常,并传递给catch处理,并定义资源释放。

异常在继承或者实现中的使用细节:

1,子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。

3,当被覆盖的方法没有异常声明时,子类覆盖时时无法声明异常的。

举例:父类存在这种情况,接口也有这种情况,

问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常,怎么办?

无法进行throws声明,只能catch的捕获。问题处理不了catch中继续throw抛出,

但是只能将异常转换成RuntimeException子类抛出。

异常转换

对于可以临时解决但是无法从根本上解决的异常问题,

需要继续声明throws出去,转换成调用者可以解决的问题。

System.out.println(e.toString());//打印异常的名称+异常的信息。

System.out.println(e.getMessage());//打印异常信息。

多个异常同时被捕获的时候,记住一个原则:

先逮小的,再逮大的。

**finally:永远被执行,除非退出jvm。System.exit(0);

面试题2个。

***:final,finally,finalize区别。

final是最终的意思。它可以用于修饰类,成员变量,成员方法。

它修饰的类不能被继承,它修饰的变量时常量,它修饰的方法不能被重写。

finally:是异常处理里面的关键字。

它其中的代码永远被执行。特殊情况:在执行它之前jvm退出。System.exit(0);

finalize:是Object类中的一个方法。

它是于垃圾回收器调用的方式。

***:假如catch中有return语句, finally里中的代码会执行吗?

是在return前,还是在return后呢?

会,在return前执行finally里面的代码。

throws和throw的区别

A:有throws的时候可以没有throw。

有throw的时候,如果throw抛的异常是Exception体系,那么必须有throws在方法上声明。

B:throws用于方法的声明上,其后跟的是异常类名,后面可以跟多个异常类,之间用逗号隔开

throw用于方法体中,其后跟的是一个异常对象名

以上是关于黑马程序员济南校区java基础:异常的主要内容,如果未能解决你的问题,请参考以下文章

成都校区Ajax

黑马程序员济南天道酬勤 恒者为胜

黑马程序员济南我的逆转人生路

黑马程序员——————> 异常处理之修复

Java基础黑马程序员教材 案例2.32.6代码详解

金贵子为什么能把托育做成功—专访济南唐冶校区张楠园长