文章目录

  • 什么是异常
  • 处理异常的语法
  • try、catch、finally、throw、throws关键字
  • java.lang.Exception父类
  • 常见异常类
  • 异常的分类
  • 自定义异常


什么是异常

异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。

JDK中定义了很多的类描述了Java程序中各种不正常的情况,而描述程序不正常的情况的类我们称作异常类。

如被零除时、数组下标越界、在null值对象上调用方法或访问其属性时等异常。虽说对某些异常(RuntimeException运行时异常) JVM自动做出处理,但应用程序中还会有很多JVM不能预知的情况,

java怎么处理越权 java 越界异常_java


就如此代码,发生了数组越界异常(ArrayIndexOutOfBoundsException: 3)

处理异常的语法

处理异常,我们通常用try、catch、finally;throw、throws等关键字
(以下的例子只是引出异常的语法,不做详细介绍,后面再详细介绍,初学者看不懂代码没关系)

public class Demo001 {
    public static void main(String[] args) {
    //用try捕获异常,catch处理异常
        try {
        //让程序休眠500毫秒
            Thread.sleep(500);
        } catch (InterruptedException e) {
        //打印跟踪站信息
            e.printStackTrace();
        }finally {
        //最后执行的信息
            System.out.println("over");
        }
    }
}
public class Demo001 {
    public static void main(String[] args) throws InterruptedException {
    //让程序休眠500毫秒
     Thread.sleep(500);
    }
}
public class Demo001 {
    public static void main(String[] args) throws Exception {
        String str = null;
        if (str.equals(null)) {
            throw new Exception();
        }
        
    }
}

try、catch、finally、throw、throws关键字

java怎么处理越权 java 越界异常_运行时异常_02

  1. try代码块是用以包含可能出现异常的代码,
    catch块捕获try代码块中产生的异常(catch块可以有多个,并且异常只能进入一个catch中,不能进入多个。因为在try代码块中,代码按顺序执行,先找到那个异常,就先进入匹配的catch中,如果没有finally的话,一般程序就会结束了,下面没有找到的异常也不再执行了),
    finally块(这是可选择的块,可以选择使用也可以不使用,具体看情况)跟在catch或try之后用于确保无论是否发生异常都需执行的代码。
public class Demo001{
    public static void main(String[] args){
        //不使用finally
        try {
            int[] ints = new int[3];
            ints[3]=1;
            Thread.sleep(500);
        } catch (ArrayIndexOutOfBoundsException e) {
            //出现异常就打印出:抛出异常了
            System.out.println("抛异常了");
//            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Demo001{
    public static void main(String[] args){
      
        try {
            int[] ints = new int[3];
            ints[3]=1;
            Thread.sleep(500);
        } catch (ArrayIndexOutOfBoundsException e) {
            //出现异常就打印出:抛出异常了
            System.out.println("抛异常了");
//            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            System.out.println("执行finally代码块");
        }
    }
}

java怎么处理越权 java 越界异常_java怎么处理越权_03

  1. throw用在方法或构造函数里,用于手动引发异常。(当然,throw可以配合throws或者try、catch使用)
public class Demo001 extends Thread {
    public static void main(String[] args) {
        System.out.println("is");
        throw new NullPointerException("the");//手动抛出一个空指针异常,指定信息为:the
    }
}
  1. thows用在方法或构造函数的定义上,说明方法或构造函数会产生哪些异常。可以声明多个异常,多个异常用逗号隔开。
public class Demo001{
    public static void main(String[] args) {
        Person.P();
    }
}
class Person{
    public static void P() throws ArrayIndexOutOfBoundsException{
        int[] ints = new int[3];
        System.out.println(ints[3]);
    }
}
public class Demo001{
    public static void main(String[] args) {
        try {
            Person.P();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("捕获异常");
        }
    }
}
class Person{
    public static void P() throws ArrayIndexOutOfBoundsException{
        int[] ints = new int[3];
        System.out.println(ints[3]);
    }
}

java.lang.Exception父类

异常类的继承结构如下图:

Error:Error类对象由 Java
虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。例如,Java虚拟机运行错误(Virtual Machine Error)等,这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;

Exception:在Exception分支中有一个重要的子类RuntimeException(运行时异常),该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;

java.lan.Exception有五种构造,如图:


继承的方法:

java怎么处理越权 java 越界异常_System_04

具体的可以去看API:https://docs.oracle.com/javase/8/docs/api/index.html (不会看API的自己去网上学习如何看,学Java,会看API是基础)

常见异常类

异常的分类

  • 编译时异常(非运行时异常、检查型异常、受控异常):

这类异常一定要在代码里用try-catch来处理。Exceptionn属于检查型异常。
如:
IOException:文件读写或通过网络读写时会发生。
SQLException:数据库操作(增、删、改、查)时会发生
等等……

  • 运行时异常(非检查型异常、不受控异常):

如被0除、NullPointerExceptiont,数组下标越界等操作就会出现这类异常,这类异常JVM会自动处理不强制的要求用户在代码里用try-catch处理。
常见的运行时异常有如下:
java.lang.ArithmeticException算术异常
java.lang.ClassCastException类型转换异常,一般出现在强制类型转换中。
java.lang.IllegalArgumentException非法参数异常
java.lang.IndexOutOfBoundsException下标越界异常
java.lang.NullPointerException空指针异常,在null对象上访问方法或属性
等等……

自定义异常

异常是类,因为可用异常表示一种业务领域中的问题类型,所以自定义异常可以更加明确具体的知道应用出现了何种问题,使开发人员更容易的定位应用程序产生问题的原因和位置。自定异常一般从Exception (编译时异常)或RuntimeException (运行时异常)类开始继承

在自定义异常中可以实现想要的功能

public class Demo001 extends Exception{
    public Demo001() {
        super();
    }

    public Demo001(String message) {
        super(message);
    }

    public Demo001(String message, Throwable cause) {
        super(message, cause);
    }

    public Demo001(Throwable cause) {
        super(cause);
    }

    protected Demo001(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}