java基础之-------异常详解

异常(Throwable)

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

java基础之-------异常详解_第1张图片
Throwable 为最顶级的

Error:(错误):
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

我们经常所说异常其实就是Exception:
他分为: 运行时异常(RuntimeException) 和非运行时异常
java基础之-------异常详解_第2张图片

一 、异常处理机制

1.抛出异常:

当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行

throw new xxxException

2.捕获异常:

如果发生了异常,没有任何地方捕获这个异常,程序就会终止,有的程序需要进行捕获并且处理
使用try/catch 语句块

try{
	异常
}
catch{
	....  // 捕获
}

3.如何选择抛出还是捕获

如果我们不知道怎么解决这个异常,我们采用的方式是抛出异常,如果知道如何进行处理,那我们就捕获

二、创建自己的异常类

要求:
1.必须继承Exception或者Exception的字类
2.有两个构造方法,无参构造,有参构造

//或者继承RuntimeException(运行时异常) 
public class MyException extends Exception { 
  private static final long serialVersionUID = 1L; 
  // 提供无参数的构造方法
  public MyException() { 
  } 
  // 提供一个有参数的构造方法,可自动生成
  public MyException(String msg) { 
    super(msg);// 把参数传递给Throwable的带String参数的构造方法 
  } 
} 


// 调用:
 throw new MyException("不能输入负数");

三、finally 字句

代码抛出一个异常之后,就会停止处理这个方法中剩余的代码,并且退出这个方法,如果这个方法中获取了一些本地的资源,而且这些资源必须被清理,就会出现问题。finally可以很好的解决这个问题。
不管有没有异常被捕获,fianlly中的代码都会被执行。

var in = new FileInputStream(....);
try{
	代码1;
}catch{
	代码2;
}finally{
	代码3;
}

无论代码1中是不是有异常,都会执行代码3

finally子句的作用是用来清理资源,不要做流程控制语句

四、使用try-with-resources优雅关闭资源

在1.7之前,对于资源的关闭很繁琐,需要在finaly中嵌入finally

public static void main(String[] args){

    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream("file.txt");
        fileInputStream.read();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            assert fileInputStream != null;
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

但是使用了try-with-resources语法后,上面的例子可改写为:

try(FileInputStrem fileInputStream = new FileInputStream("file.txt")){
	fileInputStream.read();
} catch (IOException e) {
	e.printStackTrance();
}

五、断言 assert

java中处理系统错误的三个机制: 抛出,日至,断言
断言只是测试使用,反正我觉得没啥用

你可能感兴趣的:(java晋升之路)