异常指程序运行不正常,导致程序停止。其实就是java对不正常现象的描述。ERROR则是对一般不可处理的严重问题的处理描述。
而异常则是对不严重问题进行处理。
异常的分类:
1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
这样的问题都可以针对性的处理。
2,编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部
状态的改变导致的。
那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停 ,让调用者对代
码进行修正。
所以自定义异常时,要么继承Exception,要么继承RuntimeException。
异常的处理,java提供了特定语句对其进行处理,语句如下:
try{}
catch{}
finlly{}
try里面这个是执行的代码,catch则是处理异常,finally则是有没有异常都没执行,即使前面有return也会执行。
Exception类有getMessage打印出异常信息,toString则可以打印出更多信息。
printStackTrace 则可以打印出异常名称,信息和位置。
有时候我们会看到方法名右边加了throws Exception,他的中文意思是抛出异常,有什么用呢,可以声明该方法
执行可能有问题,但方法自己不处理,将交给调用他的程序来处理。
接下来说明下多异常的处理:
异常处理的原则:
1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。
否则必须在函数内用trycatch捕捉,否则编译失败。
2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。
3,什么时候catch,什么时候throws 呢?
功能内容可以解决,用catch。
解决不了,用throws告诉调用者,由调用者解决 。
4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。
声明一个异常,最好能声明具体的异常。比如a/0 就不会抛出异常,一般会这样声明throws Exception
但如果你这样声明 throws ArithmeticException 就会抛出更具体的异常。同时一个方法中可能有不同的异常,
所以你也可以声明多个异常。
既然有声明多个异常,当你用trp catch 去处理,就应该有相同的catch处理块。
还有一个问题,就是我们会看到throw和throws,2者有声明区别呢?
throws使用在函数上,而throw使用在函数内
throws后面都是异常类,而throw跟的是异常对象.
你还可以自定义异常,只要继承Exception或其子类。
当你自定义异常是:如果该异常的发生,你要将程序自动停止下来,你就让自定义异常继承RuntimeException
RuntimeException是指运行时,如果有异常,则程序会自动停止。
接下来说下自定义异常:
将可能会出现的问题进行自定义描述。并封装成对象。 这种自定义的问题描述成为自定义异常。
注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性。 才可以被两个关键字所操作,throws throw
看下例子:
class FuShuIndexException extends Exception //自定义异常,继承Exception
{
FuShuIndexException()
{}
FuShuIndexException(String msg)
{
super(msg);
}
}
class Demo
{
public int method(int[] arr,int index) throws FuShuIndexException//throws NullPointerException//FuShuIndexException
{
if(arr==null)
throw new NullPointerException("数组的引用不能为空!");
if(index>=arr.length)
{
throw new ArrayIndexOutOfBoundsException("数组的角标越界啦:"+index);
}
if(index<0)
{
throw new FuShuIndexException("角标变成负数啦!!");
}
return arr[index];
}
}
class ExceptionDemo3
{
public static void main(String[] args) throws FuShuIndexException //throws FuShuIndexException
{
int[] arr = new int[3];
Demo d = new Demo();
int num = d.method(arr,30);
System.out.println("num="+num);
System.out.println("over");
}
}
打印的结果为:将会抛出 数组的角标越界啦:30
如果将上面int num = d.method(arr,30); 改为int num = d.method(null,30); 打印: 抛出 数组的引用不能为空!的异常