黑马程序员济南校区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基础:异常的主要内容,如果未能解决你的问题,请参考以下文章