JAVA基础整理(4)-异常

import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.Logger;

/**
 * Java异常(Exception)
 * 

* 在 Java 中一个异常的产生,主要有如下三种原因: * Java 内部错误发生异常,Java 虚拟机产生的异常。 * 编写的程序代码中的错误所产生的异常,例如空指针异常、数组越界异常等。 * 通过 throw 语句手动生成的异常,一般用来告知该方法的调用者一些必要信息。 *

* Throwable 类是所有异常和错误的超类, * 下面有 Error 和 Exception 两个子类分别表示错误和异常。 * Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。 * Error 定义了在通常环境下不希望被程序捕获的异常。一般指的是 JVM 错误,如堆栈溢出。 * Exception 又分为可检查(checked)异常和不检查(unchecked)异常, * 可检查异常在源码里必须显示的进行捕获处理,这里是编译期检查的一部分。 * 不检查异常就是所谓的运行时异常,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。 *

* 运行时异常都是 RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等, * 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起, * 程序应该从逻辑角度尽可能避免这类异常的发生。 *

* 非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。 * 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。 * 如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常(一般情况下不自定义检查异常)。 *

* Java中常见运行时异常 * ArithmeticException 算术错误异常,如以零做除数 * ArraylndexOutOfBoundException 数组索引越界 * ArrayStoreException 向类型不兼容的数组元素赋值 * ClassCastException 类型转换异常 * IllegalArgumentException 使用非法实参调用方法 * lIIegalStateException 环境或应用程序处于不正确的状态 * lIIegalThreadStateException 被请求的操作与当前线程状态不兼容 * IndexOutOfBoundsException 某种类型的索引越界 * NullPointerException 尝试访问 null 对象成员,空指针异常 * NegativeArraySizeException 再负数范围内创建的数组 * NumberFormatException 数字转化格式异常,比如字符串到 float 型数字的转换无效 * TypeNotPresentException 类型未找到 *

* Java常见非运行时异常 * ClassNotFoundException 没有找到类 * IllegalAccessException 访问类被拒绝 * InstantiationException 试图创建抽象类或接口的对象 * InterruptedException 线程被另一个线程中断 * NoSuchFieldException 请求的域不存在 * NoSuchMethodException 请求的方法不存在 * ReflectiveOperationException 与反射有关的异常的超类 *

*

* Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。 * try catch 语句用于捕获并处理异常, * finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码, * throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。 * try { * 逻辑程序块 * } catch(ExceptionType1 e) { * e.printStackTrace(); * } catch (ExceptionType2 e) { * e.printStackTrace(); * throw(e); // 再抛出这个"异常" * } finally { * 释放资源代码块 * } * 在多个 catch 代码块的情况下,当一个 catch 代码块捕获到一个异常时,其它的 catch 代码块就不再进行匹配。 * 当捕获的多个异常类之间存在父子关系时,捕获异常时一般先捕获子类,再捕获父类。 * 所以子类异常必须在父类异常的前面,否则子类捕获不到。 *

* 无论是否发生异常(除特殊情况外),finally 语句块中的代码都会被执行 * 除非在 try 块、catch 块中调用了退出虚拟机的方法System.exit(int status), * 否则不管在 try 块或者 catch 块中执行怎样的代码,出现怎样的情况,异常处理的 finally 块总会执行。 *

* 通常情况下不在 finally 代码块中使用 return 或 throw 等导致方法终止的语句, * 否则将会导致 try 和 catch 代码块中的 return 和 throw 语句失效 * finally 代码块中的 return 语句一定会执行。 * 无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。 *

* 输出相应的异常信息 * printStackTrace() 方法:指出异常的类型、性质、栈层次及出现在程序中的位置 * getMessage() 方法:输出错误的性质。 * toString() 方法:给出异常的类型与性质。 *

* 自动资源管理 * ,Java 7 增加了一个新特性,该特性提供了另外一种管理资源的方式, * 这种方式能自动关闭文件,被称为自动资源管理(Automatic Resource Management)。 * 该特性是在 try 语句上的扩展,主要释放不再需要的文件或其他资源。 * try (BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java")) { * // 可能会生成异常语句 * } catch(Throwable e1){ * // 处理异常e1 * } *

* throws 声明异常 * 当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。 * 使用 throws 声明的方法表示此方法不处理异常。 * 与 throws 不同的是,throw 语句用来直接拋出一个异常 * throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常; * throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。 * 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息, * 而在方法(类)内部通过 throw 声明一个具体的异常信息。 * throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; * throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。 *

* Java 7新特性:多异常捕获 * try{ * // 可能会发生异常的语句 * } catch (IOException | ParseException e) { * /所以下面代码有错 * //捕获多种类型的异常时,异常变量使用隐式的 final 修饰 * e = new AException("1"); * } * 由于 FileNotFoundException 属于 IOException 异常,IOException 异常可以捕获它的所有子类异常。所以不能写成 FileNotFoundException | IOException | ParseException *

* Java自定义异常 * class MyException extends Exception { * public MyException() { * super(); * } * public MyException(String s) { * super(s); * } * } *

* Java.util.logging:JDK自带记录日志类 * Logger.getGlobal().info("打印信息"); * 级别 SEVERE WARNING INFO CONFIG FINE FINER FINEST * 调用方法 severe() warning() info() config() fine() finer() finest() * 含义 严重 警告 信息 配置 良好 较好 最好 */ public class HelloWord { private static Logger log = Logger.getLogger(HelloWord.class.toString()); public static void main(String[] args) { System.out.println("今年 java"); e1(); try { readFile(); // 调用 readFHe()方法 } catch (IOException e) { // 捕获异常 System.out.println(e); } finally { // 捕获异常 } //日志打印 Logger.getGlobal().info("打印信息"); log.info("打印信息"); log.warning("打印信息"); log.severe("打印信息"); } //执行finally模块 //0 //无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。 public static int e1() { int result = 0; try { return result; } finally { System.out.println("执行finally模块"); result = 1; } } //当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。使用 throws 声明的方法表示此方法不处理异常。 public static void readFile() throws IOException { // 定义方法时声明异常 FileInputStream file = new FileInputStream("read.txt"); // 创建 FileInputStream 实例对象 int f; while ((f = file.read()) != -1) { System.out.println((char) f); f = file.read(); } file.close(); } }

你可能感兴趣的:(java,jvm,开发语言)