Java的异常

一:异常机制的概述

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

     程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。

     (1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。

      (2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。 

      (3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。二、 异常的结构    

       在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。

二:异常的体系

Java的异常

三,Trowable类中常用方法如下:

1. 返回异常发生时的详细信息

public string getMessage();

2. 返回异常发生时的简要描述

public string toString();

3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同

public string getLocalizedMessage();​​​​​​

4. 在控制台上打印Throwable对象封装的异常信息

public void printStackTrace();

四:异常的解析:

  1. Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。
  2. Exception::程序本身可以捕获并且可以处理的异常。
  3. 运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
  4. 非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

​​​​​​​

五:异常的处理

抛出异常:throw,throws

捕获异常:try,catch,finally

抛出异常throw

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行。抛出的时候是抛出的是一个异常类的实例化对象,在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出

使用的格式:throw new 异常类名

通过throws抛出异常

定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常。

使用格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }

     (public static void readFile() throws FileNotFoundException )

 

==============================================================

注意:

  try{ 

 代码块;

return;

}catch()

{代码块}

finally{代码块}

return;

通过上面这个简短的语句,我们来分析这句话的执行顺序。按照程序的执行顺序,代码段首先进入try语句,因无异常抛出,代码将要return的内容保存在内存中,然后执行finally,因finally中无可执行内容,再转回try中执行return,整个代码段执行结束,而finally后面的return是不会执行的。如果有复杂点的场景欢迎在下方留言,我们一同来分析解答。

1、不管有没有出现异常,finally块中代码都会执行(编译器会将 finally 块中的代码复制两份并分别添加在 try 和 catch 的后面);

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

try{ 

 代码块;

return;

}catch()

{代码块

}finally{

代码块;

return;

}

你会发现程序最终会采用 finally 代码块中的 return 语句进行返回,而直接忽略 try 语句块中的 return 指令

6. 自定义异常

当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。

自定义异常步骤:

•[1] 确定异常类型.继承Excepion 或者RuntimeException

•[2] 编写自定义异常类,并实现构造方法

•[3] 在方法需要的地方手动声明并抛出异常。

public class myException extends Exception {

public myException {

super;

}

public myException(String message) {

super(message);

}

//自定义异常中的方法,以符合自己的需求

public void showInfo {

System.out.println(super.getMessage+"@Line:");

}