面向对象的方式处理异常:
==抛出异常==:执行一个方法时,如果发生异常,这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE
==捕获异常==:JRE得到该异常之后,寻找相应的代码来处理该异常,JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止
package com.alexanderli95.testException;
/**
* 测试异常
*/
public class TestException {
public static void main(String[] args){
try {
Thread.sleep(1000); //checked exception 需要手动捕获
} catch (InterruptedException e) {
e.printStackTrace();
}
int i=1/0; //unchecked exception 编译器自动捕获
}
}
package com.alexanderli95.testException;
import java.io.*;
import java.io.IOException;
/**
* 通常在finally里面放关闭已打开资源的代码
*/
public class TestException02 {
public static void main(String[] args) {
FileReader fr=null;
try {
fr=new FileReader("e:/a.txt"); //此处由于要和外部环境交互,所以需要加异常捕获
char c=(char)fr.read();
System.out.println(c);
} catch (FileNotFoundException e) { //FileNotFoundException是IOException的子类,catch语句子类在前父类在后
e.printStackTrace();
} catch (IOException e){ //一个try可以跟多个catch
e.printStackTrace();
}finally { //最好不要在finally中加return语句,不然会覆盖try代码块中return的内容
try {
if(fr!=null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.alexanderli95.testException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* 测试throws
* throws: 声明异常
* 方法重写时,子类声明异常时的范围不可超出父类的范围,子类也不能抛出父类的父类的异常
*/
public class TestThrowException {
public static void main(String[] args) {
String str=new String();
try {
str=new TestThrowException().openFile();
} catch (IOException e) {
e.printStackTrace();
}finally {
System.out.println(str);
}
//手动抛出异常,不常用
File f=new File("e:/b.txt");
if(!f.exists()){
try {
throw new FileNotFoundException("File cannot be founded");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
String openFile() throws FileNotFoundException, IOException { //抛出异常,在函数中不作处理,调用时处理
FileReader fr=new FileReader("e:/a.txt");
char c=(char)fr.read();
return ""+c;
}
}
package com.alexanderli95.testException;
/**
* 自定义异常
*/
public class MyException extends Exception{
public MyException(){
}
public MyException(String message){
super(message);
}
}
class Test{
static void t() throws MyException{
//
}
public static void main(String[] args) {
try {
t();
} catch (MyException e) {
e.printStackTrace();
}
}
}