知识来源:
https://www.zhihuishu.com/portals_h5/2clearning.html#/course2cStudy/2014114?type=1&VNK=dee38fc6
https://www.bilibili.com/video/av795118111?p=1
我们在编程过程中,会出现各种各样的错误,大体可以分为三类:编译错误,运行时错误和逻辑错误。其中编译错误在编译过程中IDE就能发现,逻辑错误程序本身无法解决,只有运行时错误是可以直接避免的。
Java提供了Throwable类专门解决这类问题,Throwable下定义了两个子类Error和Exception,这篇文章主要讲解Exception相关的基础知识。首先要了解Error(错误)和Exception(异常)之间的区别,两者都指的是程序运行中出现的错误,导致程序无法继续运行,但Error指的是程序自身无法解决的问题,例如虚拟机错误、内存溢出等,这类问题一旦出现,整个程序往往直接崩溃或停止运行;但有些问题程序自身可以直接捕获到异常的发生,进而转入另一个分支,例如零指针异常,数组下标越界等异常。
Exception下子类包括RuntimeException(运行时异常)、IOException(IO异常)、SQLException(SQL异常)等,你也可以自己继承Exception类编写自己的异常类,看以下程序:
public class test
{
public static void main(String[] args)
{
division(1,0);
}
static void division(int a,int b)
{
System.out.print(a/b);
}
}
在这段代码中,我进行了1/0的操作,运行结果如下:
这里程序自身进行了异常处理。第一行叫做抛出异常,抛出了异常类 java.lang.ArithmeticException,这里ArithmeticException代表算数异常,是RuntimeException的一个子类;后两行为捕获异常,程序自身指出异常发生的代码行数。
遇到这种问题,我们可以采取两种方式,第一种,直接在division函数中添加判断语句,但是并不是所有异常都能这么简单的判断和解决,那么就可以利用程序自带的异常类,进行异常处理。
异常处理有两种方法:
1. try{...}catch{...}finally{...}语句
其中try{...}中的代码块为可能发生异常的代码,catch{...}中的代码块为一旦出现异常后执行的代码,finally{...}中的代码块为不论出不出现异常,最终都要运行的代码。对之前代码作如下修改:
public class test
{
public static void main(String[] args)
{
division(1,0);
}
static void division(int a,int b)
{
try
{
System.out.print(a/b);
}
catch(Exception e)
{
System.out.println("0不能作除数!");
}
finally
{
System.out.println("over!");
}
}
}
运行结果如下:
2. 将异常向上抛出
通过在函数第一个大括号前添加throws Exception语句,将异常抛出到上一层函数中,再上一层函数中处理,也可以不断连续抛出,在main函数抛出后,会由程序直接处理,如最初的情况。
public class test
{
public static void main(String[] args)
{
try
{
division(1,0);
}
catch(ArithmeticException e)
{
System.out.print("0不能作除数!");
}
}
static void division(int a,int b) throws ArithmeticException
{
System.out.print(a/b);
}
}
运行结果如下:。