java里的异常多种多样,这是一种很是有用的机制,它能帮助咱们处理那些咱们未知的错误,在java里,关于异常的有throw throws,还有一个try catch 程序块。接下来咱们挨个看看这几个的做用。java
throw 就是抛出一个异常,并获取这个异常的引用,这个异常会被抛到外部的环境,由外部环境进行处理数据库
class A{ public void func() throws Exception{ throw new Exception(); } }
这里抛出了一个Exception,Exception是throwable的子类,是全部异常的基类。与此同时,throwable还有另外一个子类,也就是Error。swift
这里会把Exception这个引用抛到外部环境中去处理。数组
throw跟try...catch...finally的对比:缓存
public
class
ZeroTest {
public
static
void
main(String[] args) {
try
{
int
i =
100
/
0
;
System.out.print(i);
}
catch
(Exception e){
System.out.print(
1
);
throw
new
RuntimeException();
}
finally
{
System.out.print(
2
);
}
System.out.print(
3
);
}
}
try catch是直接处理,处理完成以后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。
本题的catch语句块里面,打印完1以后,又抛出了一个RuntimeException,程序并无处理它,而是直接抛出,
所以执行完finally语句块以后,程序终止了
那咱们就不得不说一下throws,其实throws并非抛出一个实际的Exception而是一个异常声明,它声明这个方法可能会抛出一个异常,注意是可能,因此在没有异常的状况下也是能够用throws的,而throws自己的做用也是用来提升程序的健壮性,反过来,若是这个方法的的确确的有一个异常,那么编译器会强制让你加上throws这个异常声明。安全
一般throws是写在参数列表的后面,这样就代表这个方法有可能会抛出一个异常spa
class A{ public void func() throws Exception{ throw new Exception(); } public void g() throws Exception{ } }
当咱们在其环境中调用func 和 g的时候,编译器会通知咱们须要用一个Try catch程序块来处理这个异常。指针
这个程序块分两块,第一块是try{} ,第二块是catch(exception的引用){}
try这个程序块颇有意思,由于它的名字很易懂,就是尝试,尝试能不能正常的走完整个做用域,若是不能则抛出一个异常。因此咱们在try块里常常放上可能会抛出异常的程序段。
而catch刚好就是处理try里抛出来的异常,其中catch的参数列表接收的是一个异常的引用,是throw抛出来的异常的引用,这样咱们就能够获得这个异常的对象,倒不如说咱们是获得来了这个异常对象的引用,由于在java里,一般咱们也只能经过引用来操纵对象。code
PS:当 throw new RuntimeException的时候,不用throwsorm
public class Main { public static void main(String[] args){ A a = new A(); try{ a.func(); a.g(); } catch(Exception e){ System.out.println("捕获了一个异常"); } } }
咱们捕获了func 的异常,由于咱们明确的指明func 会抛出一个异常throw new Exception();因此咱们这里也会捕获到,并去处理它,因此运行起来咱们会看到控制台上会打印“捕获了一个异常”。
尽管g()没有抛出任何的异常,编译器仍是要求咱们要用try catch把它括起来,是由于它拥有一个throws 异常说明。
**下面是常见的几种异常,供你们参考:
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操做数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException