Throwable是所有错误与异常的父类,他有Error与Exception两个基本子类。
Throwable类中的常用方法:
(1)String getMessage() 返回异常信息
(2)void printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置
(3)void printStackTrace(PrintStream s) 该方法将异常内容保存在日志文件中,以便查阅
Error类是不可恢复的错误,程序不需要对其进行捕获。但是我们可以对Exception类的异常进行捕获,并进行处理。
下面是一些常见的异常
ClassCastException 当试图将一个对象强制转化为不是他的子类时抛出(类型转化异常)
IndexOutOfBoundsException 当对数组,字符创,集合中的的角标超出范围时抛出(角标越界异常)
ArrayIndexOutOfBoundsException(数组角标越界异常)
NullPointerException 当需要对象是使用null时抛出(空指针异常)
例如下面的代码将抛出ArrayIndexOutOfBoundsException异常
<span style="font-size:14px;">public class Test{
public static void main(String[] args) {
int[] num = {2,5,3,6,4,7};
for(int i = 0; i <= num.length; i++){
System.out.println(num[i]);
}
}
}</span>
RuntimeException是Exception异常类的子类,他是编译时不被编译器检测的异常。只要将程序设计的正确,就可以避免这类异常的发生,所以编译器允许对这类异常不进行捕获及处理。
如果程序抛出的是Error或者是RuntimeException除外的其他异常,程序都必须对其进行处理。
异常的处理
java 提供了特有的语句进行处理。
(1)使用try/catch语句块对异常进行捕获处理
<span style="font-size:14px;">try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}</span>
注:
<1>try/catch语句块后面可以没有finally语句块
<2>一个try可以对应多个catch语句块,每一个catch处理一个不同的异常。finally一般进行资源的关闭,或者对一些即时操作的回退(银行中的取款,存款业务处理,若发生异常,就会操作回退处理)
(2)使用throws关键字在代码所在的方法上进行抛出处理,由调用它的方法或者java虚拟机进行默认处理
<span style="font-size:14px;">public class Test{
public static void main(String[] args) {
int[] num = {2,5,3,6,4,7};
try{
for(int i = 0; i <= num.length; i++){
System.out.println(num[i]);
}
}catch(IndexOutOfBoundsException e){
System.out.println("数组角标越界");
}
}
}</span>
自定义异常:
自定义异常一般是继承Exception或者其子类来实现的
因为程序中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想,进行异常的自定义封装。
<span style="font-size:14px;">class fuzhiException extends Exception
{
private String msg;
fuzhiException(String msg)
{
this.msg = msg;
}
public String getValue()
{
return msg;
}
}
class Test
{
public static void main(String[] args)
{
int a = 10;
try
{
int x = add(10, -20);
System.out.println("x="+x);
}
catch (fuzhiException e)
{
System.out.println(e.toString());
System.out.println(e.getValue());
}
}
public static int add(int a,int b)throws fuzhiException
{
if(b<0)
throw new fuzhiException("钱数必须是正值"+b);
return a+b;
}
}</span>
fuzhiException
钱数必须是正值-20
throws 和throw的区别:
(1)throws一般用在方法上,用于标示异常类
(2)throw在方法内,用于抛出异常对象,需用new关键字产生异常对象