定义:异常就是有异于常态,和正常情况不一样,有错误出现。在java中,将程序执行过程中的不正常的情况称之为异常,开发过程中的语法错误和逻辑错误不是异常,发生异常时java会阻止当前方法或作用域的情况。
异常的体系结构
Throwable是异常的超类,他有两个子类:Error 和 Exception。Error是错误的意思,一般出现这个错误都是jvm的出错,改代码没用,所以通常情况下,Exception异常对我们来说更重要,Exception 包括受检异常(IOException)和非受检异常(RuntimeException)。
常见的异常有: * ArithmeticException算术运算异常
* ArrayIndexOutOfBoundsException数组下标越界异常
* InputMismatchException 输入不匹配
* NullPointerExceptoin 空指针异常
* Exception
* RuntimeException
* ClassNotFoundException
* DataFormatException
* ClassCastException
异常的关键字
throws、throws、(try、catch、finally:不能单独出现) Exception:受检和非受检
* 1、Throwable是异常的基类,分为Error和Exception,在编程中我们关注Exception
* 2、Exception分为编译器异常(受检)和运行期异常(非受检)
* 3、异常会导致程序中断无法执行
* 4、在开发中,我们需要把可能出现的代码使用try语句块包裹起来
* 5、处理异常可以让程序保持运行状态
* 6、catch可以有多个,顺序为从子类到父类,大的放后面,小的放前面
finally、final、finalize的区别
* 1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。 因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用, 即不能方法重写。
* 2、finally是在异常处理时提供finally块来执行任何清除操作。 不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容, 是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码, 就可以放在finally块中。
* 3、finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这 个对象调用的。
throws和throw用法:
throws:跟在方法名后面,后面跟异常类名;
可以跟多个类名,用“,”隔开;表示抛出异常,由该方法的调用者来处理;
表示有异常的可能性,并不一定会出现异常
throw: 跟在方法体内,后面跟的是异常对象名;
只能跟一个异常对象名;表示抛出异常,由该方法的语句来处理;
抛出了异常,执行throw则一定出现了某种异常;
代码实例
代码如下(示例):
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
div(10, 0);
arrays();
input();
div2(20,0);
method();
}
/* 除法运算 */
private static void div(int num1, int num2) {
try {
System.out.println("除法运算");
int result = num1 / num2;
System.out.println("result = " + result);
} catch (ArithmeticException e) {
System.out.println("除数不能为零!!!");
} finally {
// 不管会不会抛出异常,finally都会被执行
System.out.println("除法运算结束,异常处理可以使程序继续运行");
System.out.println();
}
}
/* 数组越界测试 */
private static void arrays() {
int[] arr = { 1, 2, 3, 4, 5 };
try {
System.out.println("数组下标越界测试");
System.out.println(arr[5]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界,数组下标不能超过" + (arr.length - 1));
} finally {
// 不管会不会抛出异常,finally都会被执行
System.out.println("数组下标越界测试结束,异常处理可以使程序继续运行");
System.out.println();
}
}
/*输入类型不匹配异常测试*/
private static void input() {
//ctrl+shift+o 导包
Scanner input = new Scanner(System.in);
try {
int num = input.nextInt();
System.out.println(num);
}catch(InputMismatchException e){
System.out.println("输入不匹配。。");
}
}
private static int method() {
int a = 10;
int b = 5;
try {
System.out.println("a = " + a);
System.out.println("b = " + b);
int c = a / b;
System.out.println("c = " + c);
return c;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 不管会不会抛出异常,finally都会被执行
System.out.println("finally:代码块中执行关闭连接、关闭文件和释放线程的的操作");
System.out.println();
}
return -1;
}
private static int div2(int a,int b) throws ArithmeticException{
try {
int c= a/b;
return c;
}catch(ArithmeticException e) {
throw new ArithmeticException("除数不能为0");
}finally {
System.out.println("运行结束");
System.out.println();
}
}
}
总结
异常处理是Java基础中的重要组成部分,熟练掌握异常处理对我们学习Java有着重要的作用。