Java 语言中异常主要分为两类:检查型异常(checked exception)和非检查型异常(unchecked exception)。
检查异常也称为“编译时异常”。Java 认为 Checked 异常都是可以被处理的异常,所以 Java 程序必须显式处理 Checked 异常。如果程序没有处理 Checked 异常,该程序在编译时就会发生错误无法编译。
如果代码中抛出了检查异常,我们必须进行处理。处理方式有两种方法:
方法一:直接抛出去,让其他使用该方法的方法去处理,例如:
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; public class Demo { public static void main(String[] args) { try { Demo demo = new Demo(); String str = demo.getFile("D:/test.txt"); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } private String getFile(String filePath) throws IOException { File file = new File(filePath); return FileUtils.readFileToString(file, StandardCharsets.UTF_8); } }
方法二:直接使用 try-catch 语句进行处理,例如:
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; public class Demo { public static void main(String[] args) { Demo demo = new Demo(); String str = demo.getFile("D:/test.txt"); System.out.println(str); } private String getFile(String filePath) { try { File file = new File(filePath); return FileUtils.readFileToString(file, StandardCharsets.UTF_8); } catch (IOException e) { e.printStackTrace(); } return null; } }
非检查型异常又称运行时异常。运行时异常都是 RuntimeException 类及其子类异常,如:NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。
(1)非检查异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常
(2)非检查异常可以传播到方法或者是构造函数的外面
(3)检查型异常必须要用 throws 语句在方法或者是构造函数上进行声明,或者使用 try-catch 语句进行捕获并处理。不然,程序无法正常编译。
空指针异常,操作一个null对象的方法或者属性时触发。
内存异常异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的内存堆,需要调整堆内存大小(-Xmx)以及优化才程序。
IO,即:input,output,我们在读写磁盘文件,网络内容的时候会发生的一种异常,这种异常是受检查的异常,需要手工捕获。
文件找不到异常,如果文件不存在就会抛出这种异常。
类找不到异常,在类路径下不能加载指定的类。
类型转换异常,如将一个数字强制转换成字符串。