java的异常处理:抓抛模型
* 1.抓:异常的处理,有两种方式(①try-catch-finally② throws + 异常的类型)
* 2.抛:一旦执行过程中,出现异常,会抛出一个异常类的对象。(自动的抛出 vs 手动的抛出(throw + 异常类的对象))
* >异常类,既可以是现成的异常类,也可以是自己创建的异常类
* 异常处理的方式一:try-catch-finally
* 异常处理的方式二:在方法的声明处,显式的抛出该异常对象的类型
* 格式:如:public static void method2() throws FileNotFoundException,IOException{}
* 当在此方法内部出现异常的时候,会抛出一个异常类的对象,抛给方法的调用者。
* 异常的对象可以逐层向上抛,直至main中。当然在向上抛的过程中,可以再通过try-catch-finally进行处理。
当main函数也是向上抛时,抛向的是虚拟机,则由编译异常转化为运行时异常
示例一:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestException {
public static void main(String[] args){
try{
method2();
}catch(FileNotFoundException e){
System.out.println(e.getMessage());
}catch(IOException e){
e.printStackTrace();
}
method3();
}
public static void method3(){
try{
method1();
}catch(Exception e){
e.printStackTrace();
}
}
public static void method2() throws FileNotFoundException,IOException{
method1();
}
public static void method1() throws FileNotFoundException,IOException{
FileInputStream fis = new FileInputStream(new File("hello1.txt"));
int b;
while((b = fis.read()) != -1){
System.out.print((char)b);
}
fis.close();
}
}
示例二:(自定义异常)
自定义的异常类:
//如何自定义一个异常类
//1.自定义的异常类继承现有的异常类
//2.提供一个序列号,提供几个重载的构造器
public class MyException extends Exception{
static final long serialVersionUID = -70348975766939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
抛出自定义异常的示例
//1.手动的抛出一个异常的例子
//2.抛出的异常类型:若是RuntimeException,可以不显式的处理
//若是一个Exception,必须要显式的处理。
public class TestCircle {
public static void main(String[] args) {
Circle c1 = new Circle(2.1);
Circle c2 = new Circle(2.1);
try {
System.out.println(c1.compareTo(c2));
System.out.println(c1.compareTo(new String("AA")));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Circle{
private double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public Circle(double radius) {
super();
this.radius = radius;
}
//比较两个圆的半径的大小。
public int compareTo(Object obj) throws Exception{
if(this == obj){
return 0;
}
else if(obj instanceof Circle){
Circle c = (Circle)obj;
if(this.radius > c.radius){
return 1;
}else if(this.radius == c.radius){
return 0;
}else{
return -1;
}
}else{
//return -2;
//手动的抛出一个异常
//throw new Exception("传入的类型有误!");
//throw new String("传入的类型有误!");
throw new MyException("传入的类型有误!");
}
}
}