一、异常家族图解
1、Throwable:代表是可抛出的.它是所有异常的超类,Java中的所有不正常类都继承于Throwable类
2、Error : 代表的是严重错误, 这种错误程序员无法进行处理, 例如操作系统崩溃, jvm出错、虚拟机错误(VirtualMachineError)、线程死锁(ThreadDeath)、动态链接库失败等. Error并不是异常,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;
3、Exception 代表的就是异常了. 它下面很多派生类, 其中它的派生类也分两种, 一种是RuntimeException(运行时异常), 其他的都是非运行时异常(另外一种说法:Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常))
4、RuntimeException异常主要包括以下四种异常(其实还有很多其他异常,这里不一一列出):空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexoutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)。RuntimeException异常会由java虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
4.1、ArithmeticExcpetion 算术异常, 它是RuntimeException的派生类, 所以程序员不手动处理也通过编译, 只不过出错时会被jvm处理.
5、非RuntimeExcptiony又叫检查异常(引起该异常的原因多种多样,比如说文件不存在、或者是连接错误等等。跟它的“兄弟”RuntimeException运行异常不同,该异常我们必须手动在代码里添加捕获语句来处理该异常,这也是我们学习java异常语句中主要处理的异常对象。)这种异常属于Excepion的派生类, 但是不是RuntimeException的派生类, 这种异常必须由程序员手动处理,否则不通过编译.
二、处理异常
1、try-catch-finally
(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。
【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】
(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。
【编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。】
(3)finally:最终执行的代码,用于关闭和释放资源。
注意:
1、不管有木有出现异常或者try和catch中有返回值return,finally块中代码都会执行;
2、finally中最好不要包含return,否则程序会提前退出,返回会覆盖try或catch中保存的返回值。
3. e.printStackTrace()可以输出异常信息。
4. return值为-1为抛出异常的习惯写法。
5. 如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果。
6. finally 在try中的return之后 在返回主调函数之前执行。
2、throw和throws关键字
java中的异常抛出通常使用throw和throws关键字来实现。
throw ----将产生的异常抛出,是抛出异常的一个动作。
一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。
语法:throw (异常对象),如:
public static void main(String[] args) { 2 String s = "abc"; 3 if(s.equals("abc")) { 4 throw new NumberFormatException(); 5 } else { 6 System.out.println(s); 7 } 8 //function(); 9 }
throws----声明将要抛出何种类型的异常(声明)。
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
使用throw和throws关键字需要注意以下几点:
1.throws的异常列表可以是抛出一条异常,也可以是抛出多条异常,每个类型的异常中间用逗号隔开
2.方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception() throw写在方法体里,表示“抛出异常”这个动作。
3.如果某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常, 或者添加声明,将异常抛出给更上一层的调用者进行处理