Java学习07-异常

异常

1.1异常的概念

1.1.1什么是异常

异常指的是程序运行时出现的非正常情况。可能导致程序发生非正情况的原因很多,如数组下标越界、算术运算被0除、空指针访问、试图访问不存在的文件等。

1.1.2异常的类层次

在这里插入图片描述
在这里插入图片描述

  • ThrowableThrowable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
  • Error类是JVM系统内部错误,程序中不能对其编程处理。
  • Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

对于IOException异常,Java编译器证在编译代码时强制要求程序中必须有相应的异常处理代码块。

捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。
比如:除数为0,数组下标越界等
分类:编译时异常和运行时异常

1.1.3运行时异常

  • 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序
    员应该积极避免其出出现的异常。java.lang.RuntimeException类及它的子
    类都是运行时异常。
  • 对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对
    程序的可读性和运行效率产生影响。

1.1.4编译时异常

  • 是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一
    般性异常。编译器要求Java程序必须捕获或声明所有编译时异常。
  • 对于这类异常,如果程序不处理,可能会带来意想不到的结果。

1.1.5系统定义的异常

Exception类有若干子类,每一个子类代表一种特定的运行时错误,这些子类有的是系统事先定义好并包含在Java类库中的,称为系统定义的运行异常。
具体见Java API

1.2异常的处理机制

1.2.1 try-catch-finally

try{
	可能出现异常的语句块;
}
catch(异常类名 参变量名){语句块};
catch(异常类名 参变量名){语句块};
catch(异常类名 参变量名){语句块};
...
finally{语句块};

【说明】

  1. try语句块用来启动Java的异常处理机制。一个try可以引导多个cache块,子类异常cache块在前,父类cache块在后。
  2. 异常发生后,try块中的剩余语句不再执行。
  3. cache部分的语句块中的代码执行的条件是,首先在try块中发生了异常,其次是异常的类型与cache要捕捉的一致,在此情况下,运行系统会将异常对象传递给cache中的参变量,在cache块中可以通过该对象获取异常的具体信息。
  4. finally部分可有可无。如果存在,则无论异常是否有发生,finally部分的语句均要执行,即便是try或cache块中含有退出方法的语句return,也不能阻止finally代码块的执行,在进行方法返回前要先执行finally块。除非遇到System.exit(0)时将停止程序运行,这种情况不会执行finally块
  5. 如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可
    以用其父类作为catch的参数。
    比如 : 可 以 用 ArithmeticException 类 作 为 参 数 的 地 方 , 就 可 以 用
    RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。
    但不能是与ArithmeticException类无关的异常,如NullPointerException(catch
    中的语句将不会执行)
  6. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。
  7. try-catch-finally结构可以嵌套使用,finally里边还可以写try-catch
    在这里插入图片描述
    开发中,由于运行时异常比较常见,所以通常就不针对运行时异常编写try-catch-finally了,针对编译时异常,则一定要考虑异常的处理。

捕获异常的有关信息
RuntimeException类或是它的子类,这些类的异常的特点是:即使没有使用try和catch捕获,Java自己也能捕获,并且编译通过。
如果抛出的异常是IOException等类型的非运行时异常,则必须捕获,否则编译错误。也就是说,我们必须处理编译时异常,将异常进行捕捉,转化为运行时异常( 但运行时会发生异常使得程序运行终止 )。

  • getMessage() 获取异常信息,返回字符串
  • printStackTrace() 获取异常类名和异常信息,以及异常出
    现在程序中的位置。返回值void
    在这里插入图片描述

1.2.2 throws

声明抛出异常是Java中处理异常的第二种方式

  • 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这
    种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,
    而由该方法的调用者负责处理。
  • 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可
    以是方法中产生的异常类型,也可以是它的父类
  • 异常代码后续的代码不会执行。
    在这里插入图片描述

1.2.3 throw

  • 一般地,用户自定义异常类都是Exception、RuntimeException及其子类
  • 自定义异常类通常需要编写几个重载的构造器
  • 自定义异常需要提供serialVersionUID
  • 自定义的异常通过throw抛出。
  • 自定义异常最重要的是异常类的名字,当异常出现时,可以根据
    名字判断异常类型。
class MyException extends Exception {
static final long serialVersionUID = 13465653435L;
private int idnumber;
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}
public class MyExpTest {
public void regist(int num) throws MyException {
if (num < 0)
throw new MyException("人数为负值,不合理", 3);
else
System.out.println("登记人数" + num);
}
public void manager() {
try {
regist(100);
} catch (MyException e) {
System.out.print("登记失败,出错种类" + e.getId());
}
System.out.print("本次登记操作结束");
}
public static void main(String args[]) {
MyExpTest t = new MyExpTest();
t.manager();
}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42145862/article/details/88983058