文章目录
- 什么是异常
- 处理异常的语法
- try、catch、finally、throw、throws关键字
- java.lang.Exception父类
- 常见异常类
- 异常的分类
- 自定义异常
什么是异常
异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。
JDK中定义了很多的类描述了Java程序中各种不正常的情况,而描述程序不正常的情况的类我们称作异常类。
如被零除时、数组下标越界、在null值对象上调用方法或访问其属性时等异常。虽说对某些异常(RuntimeException运行时异常) JVM自动做出处理,但应用程序中还会有很多JVM不能预知的情况,
就如此代码,发生了数组越界异常(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关键字
- 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代码块");
}
}
}
- 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
}
}
- 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有五种构造,如图:
继承的方法:
具体的可以去看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);
}
}