1、异常的概念
异常是程序在运行过程中所发生的意外事件,它中断指令的正常执行。
在Object类下的Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。
其中Eror类一般指的是错误,运行环境出错,或者不可修复或难以修复等
Exception类 类则是指一些可以被捕获且可能恢复的异常情况,是一 般程序中可预知的问 题。
异常分两类:
(1)运行时异常:由系统检测,用户的java程序中可以不做处理,系统将它们交给缺省的异常处理程序
(2)非运行时异常(编译器异常):在程序中必须对其进行处理,否则编译器会指出错误。
Exception的层次:
所有的异常类都是从java.lang.Exception的子类。
Exception是Throwable的子类,除Exception类外,Throwable另一子类Error。
java程序一般不处理错误。错误发生在严重的故障,他们在java程序的处理范畴之外。
Error用来指示运行时环境发生的错误。如jvm内存溢出
java语言定义了一些异常类在java.lang标准包中。标准运行时异常的子类是最常见的异常类。java.lang包是默认加载到所有程序,所以大部分从运行时异常继承而来的异常都可以直接使用。
java的一些非检查性异常:
一些检查性异常:(编译器会检查)
下面的列表是 Throwable 类的主要方法:
1、使用try catch关键字
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
例子:
int arr[] = new int[2];
try{
System.out.println("ACCESS ELEMENT A[3]"+arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("Exception throw "+e);
}
System.out.println("out of the trycatch block");
输出
Exception throw java.lang.ArrayIndexOutOfBoundsException: 3
out of the trycatch block
2、多重捕获块()
一个try之后跟了很多catch块
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
try语句后面可以添加任何个catch块。
发生异常,则从第一个给最后一个catch块匹配。
try {
file = new FileInputStream(fileName);
x = (byte) file.read();
} catch(FileNotFoundException f) { // Not valid!
f.printStackTrace();
return -1;
} catch(IOException i) {
i.printStackTrace();
return -1;
}
1、throw/throws
一个方法没有捕获到一个检查性异常,那么该方法必须使用throws关键字来声明。
也可以使用throw关键字抛出一个异常。
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
也可以抛出多个异常
import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
2、finally关键字
finally关键字跟在catch块的最后,无论是否发生异常,finally关键字被执行,可以用作释放内存或资源的善后工作。
int arr[] = new int[2];
try{
System.out.println("ACCESS ELEMENT A[3]"+arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("Exception throw "+e);
}finally {
System.out.println("finally block achieve");
outPutStream.close();//这块并没定义,只是说明性的写一下
}
注意:
编写自定义异常应该注意下面几点:
1、所有异常都必须是Throwable的子类
2、写一个检查性异常,继承Exception类
3、运行时异常,继承RuntimeException类
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
实例:编写一个程序,对会员注册时的年龄进行验证,即检测是否在 0~100 岁。
import java.util.InputMismatchException;
import java.util.Scanner;
//这里创建了一个异常类 MyException,并提供两个构造方法。MyException 类的实现代码如下:
class MyException extends Exception{
public MyException(){
super();
}
public MyException(String str){
super(str);
}
}
//接着创建测试类,调用自定义异常类。代码实现如下:
public class ExceptionDemo {
public static void main(String[] args) {
int age;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年龄");
try {
age = scanner.nextInt(); // 获取年龄
if(age < 0) {
throw new MyException("您输入的年龄为负数!输入有误!");
} else if(age > 100) {
throw new MyException("您输入的年龄大于100!输入有误!");
} else {
System.out.println("您的年龄为:"+age);
}
}catch (InputMismatchException e1){
e1.printStackTrace();
}catch (MyException e2){
System.out.println(e2.getMessage());
}
}
}
在该程序的主方法中,使用了 if…else if…else 语句结构判断用户输入的年龄是否为负数和大于 100 的数,如果是,则拋出自定义异常 MyException,调用自定义异常类 MyException 中的含有一个 String 类型的构造方法。在 catch 语句块中捕获该异常,并调用 getMessage() 方法输出异常信息。
提示:因为自定义异常继承自 Exception 类,因此自定义异常类中包含父类所有的属性和方法。
总结:本篇讲述了java中的异常的概念及分类,及try catch,throw,throws,finally五个关键字,及自定义异常