异常处理有两种方式:声明抛出处理 和 程序捕获处理
声明抛出又分为 显式声明抛出 和 隐式声明抛出
程序捕获处理又分为 嵌套捕获 和 非嵌套捕获
隐式声明抛出异常
- 异常类型是RuntimeException类或是其子类,运行时异常,编译可通过
- 此类异常可以不做任何声明和处理,直接交给调用该方法的地方处理
例如:main方法中出现除零异常,但是main方法没有任何声明和处理,那么该异常直接交给调用main方法的Java虚拟机去处理
import java.util.*
class Example{
public static void main(String[] args){
int a, b, c;
a = 67;
b = 0;
c = a / b;
System.out.println(c);
}
}
显式声明抛出
- 如果方法中出现异常,但是该方法不负责处理该异常,那么该方法应该显式声明异常,由调用该方法的地方去处理异常
- 当子类覆盖父类方法时,子类方法抛出的异常应与父类抛出的异常相同或是其子类,不能时其父类(儿子始终小于等于爹)
例如:当进行文件操作时,可能会出现文件找不到的异常,main方法不予处理,抛给调用main方法的JVM默认处理
import java.io.File;
import java.io.IOException;
public class JavaOpenFile {
public static void main(String[] args) throws IOException {
File file = new File("./congming.txt"); // "./congming.txt"默认在当前根目录下创建文件
if (file.exists()){
System.out.println("文件已经存在");
}else{
file.createNewFile();//如果文件不存在,需要创建
System.out.println("文件创建成功");
}
}
}
非嵌套捕获
不存在多重try捕获
例如:
import java.util.*
class Example{
public static void main(String[] args){
try{
int a, b, c;
a = 67;
b = 0;
c = a / b;
System.out.println(a);
}catch(Exception e){
e.printStackTraace();
}
}
}
嵌套捕获
例如:将所有代码放在一个try语句块中,若有一句代码出现异常,程序会运行catch部分,剩余代码无法被执行,因此需要进行嵌套捕获
例如:上面的非嵌套捕获,当执行到c = a / b 时会产生异常对象,执行e.printStackTrace,则无法输出a,要想继续执行以下操作应该嵌套
import java.util.*
class Example{
public static void main(String[] args){
try{
int a, b, c;
a = 67;
b = 0;
try{
c = a / b;
}catch(Exception e){
e.printStackTraace();
}
System.out.println(a); //catch结束后仍可以被执行
}catch(Exception e){
e.printStackTraace();
}
}
}