java:异常Exception及自定义异常

一、异常的概念:

java:异常Exception及自定义异常_第1张图片

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的一些非检查性异常:

java:异常Exception及自定义异常_第2张图片

一些检查性异常:(编译器会检查)

java:异常Exception及自定义异常_第3张图片

三、异常方法

下面的列表是 Throwable 类的主要方法:

java:异常Exception及自定义异常_第4张图片

四、捕获异常

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;
}

五、throws、throw、finally关键字

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();//这块并没定义,只是说明性的写一下
}

注意:

  • catch 不能独立于 try 存在。
  • 在 try/catch 后面添加 finally 块并非强制性要求的。
  • try 代码后不能既没 catch 块也没 finally 块。
  • try, catch, finally 块之间不能添加任何代码。

六、自定义异常

编写自定义异常应该注意下面几点:

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五个关键字,及自定义异常

你可能感兴趣的:(java知识相关,java,编程语言)