1、什么是异常(Exception)
- 异常是指程序运行中出现得不期而至得各种状况。如:文件找不到、网络连接失败、非法参数等待
2、异常体系结构
一、要理解java异常处理是如何工作得,需要掌握以下三种情况
-
检查性异常:最具代表性得检查性异常是用户错误或者问题引起得异常,这是程序员无法预见得。例如要打开一个不存在得文件时,一个异常就发生了,这些异常在编译时不能被简单得忽略。
-
运行时异常:运行时异常是可能被程序员避免得异常。于检查性异常相反,运行时异常可以在编译时被忽略
-
错误(ERROR):错误不是异常,而是脱离程序员控制得问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译也检查不到。
二、java把异常当作对象处理,并定义一个基类java.lang.Throwable,其结构如下:
- Error类对象是由java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
- Exception类对象一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免。
3、java异常处理机制
一、抛出异常
当异常发生时,java虚拟机会自动抛出异常并给与提示,也可以通过throw、throws主动抛出异常
- throw:
- 表示方法内抛出某种异常
- 如果异常对象是非RuntimeException,则需要在方法体上加上throws抛出该异常,或者在方法体内用try、catch处理该异常,否则编译报错
- 执行到throw语句则后面的语句不再执行
- throws:
- 在方法体上使用,表示这个方法可能抛出某种异常
- 需要由方法的调用着进行异常处理
package com.exception;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
try {
testThrows(1,0);
}catch (ArithmeticException e){
System.out.println("Throws抛出异常");
}
try {
testThrow(1,0);
}catch (ArithmeticException e){
System.out.println("Throw关键字抛出运行时异常,不需要在方法体上声明");
}
String filePath = null;
try{
testThrow(filePath);
}catch (IOException e){
System.out.println("Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明");
}
}
//测试Throws关键字
public static void testThrows(int a,int b) throws ArithmeticException{
System.out.println(a/b);
}
//测试Throw关键字抛出运行时异常
public static void testThrow(int a,int b) {
if (b == 0){
throw new ArithmeticException();//运行时异常不需要在方法体上声明
}
}
//测试Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明
public static void testThrow(String filePath) throws IOException {
if (filePath == null){
throw new IOException();//运行时异常不需要在方法体上声明
}
}
}
二、捕获异常
可以通过try、catch、finally关键字对异常进行捕获、处理。
package com.exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//捕获多个异常:异常的类型必须是从小到大捕获
try {//try监控区域
System.out.println(a/b);
}catch (Error e){//catch后跟想要捕获地异常类型
System.out.println("程序出现错误");
}catch (Exception e){
System.out.println("程序出现异常,除数不能为零");
}catch (Throwable t){
System.out.println("程序出现异常或者错误");
}
finally {//不管有不有异常发生都会被执行
System.out.println("finally");
}
}