在Java中我们经常会看到在运行时出现一堆红码,这些红码均有其特殊意义,而这些红码,被我们称之为异常。异常,根据我们平时的理解,异常其实就是出现了某种问题。在Java中的异常大致分为两种,编译时异常和运行时异常,两种异常不同,但是相同点是抛出异常都是在运行过程中,下面让我们通过一段代码来了解一下有关异常的知识。`我们先随便写一个带有异常的代码,比如此段代码,后面的传参要求我们传入一个路径让系统通过这个路径将文件写入,此刻因为并不能通过传入的参数找到文件,所以出现了异常。我在下面用斜线标注了出来,该异常的名称为FileNotFoundException。为了方便看懂,在报错的地方,我统一在下面用斜线标注。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) {
expection1();
}
public static void expection1() {
expection2();
}
public static void expection2() {
exception3();
}
public static void exception3() {
FileInputStream fis = new FileInputStream("abc");
}
}
正如前面所说,异常其实就是一个问题,那么不管是什么地方出现了问题,我们都要想办法去解决,解决问题的方法也分为两种,其一就是这个问题我们解决不了,所以将问题抛给比我们等级更高的地方,让他们去解决,这种方法就是抛出异常。其二就是在抛出问题的过程中,恰好某个级别能够解决该异常,那么就处理完该异常,就不用再抛出异常了。接下来我们通过代码来解决该异常。
public class Demo {
public static void main(String[] args) {
expection1();
}
public static void expection1() {
expection2();
}
public static void expection2() {
exception3();
/
}
public static void exception3() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("abc");
}
}
可以看到当我们在exception3加上抛出异常后,表示异常的红线就出现在了exception2内的方法上,那么我们一直重复该操作,直到该异常不能在抛出,那么此时的代码就是这样的。
public class Demo {
public static void main(String[] args) throws FileNotFoundException {
expection1();
}
public static void expection1() throws FileNotFoundException {
expection2();
}
public static void expection2() throws FileNotFoundException {
exception3();
}
public static void exception3() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("abc");
}
}
可以很明显的得到,当我们将抛出异常语句写到main函数时,报错就消失了,那么此时异常到了哪里呢。此时的异常就被main函数抛给了JVM虚拟机,再由虚拟机执行底层的new一个FileNotFoundException异常,并调用该异常的方法将它打印在控制台。这是第一种解决异常的方法,接下来进行第二种,即我们要去捕获异常,并尝试去解决它,比如下面的代码这样。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Demo {
public static void main(String[] args) {
expection1();
}
public static void expection1() {
expection2();
}
public static void expection2() {
exception3();
}
public static void exception3() {
try {
FileInputStream fis = new FileInputStream("abc");
}
catch (FileNotFoundException f){
f.printStackTrace();
}
}
}
此时我们便不需要再去抛出异常了,而这段代码的执行结果,与前面的代码也并无太大的区别。这就是Java中异常的捕获,而前面的第一种解决异常的方法就是抛出异常。