Exception
1.简介
-
什么是异常,java提供异常机制有什么用?
当程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常。java语言是很完善的,提供了异常处理机制,当程序执行过程中出现了不正常的情况,java把异常信息打印输出到控制台,供程序员参考,程序员看到异常信息后,可以对程序进行修改,让程序看起来更加的健壮。
-
如:
public class ExceptionTest01 { public static void main(String[] args) { int a=10; int b=0; //实际上JVM在执行到此处的时候,会new一个异常对象:new ArithmeticException("/by zero") //并且JVM将new的异常对象抛出,打印输出到控制台。 int c=a/b; System.out.println(c); } }
以上程序出现了:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.ma.javase.exception.ExceptionTest01.main(ExceptionTest01.java:9)这个信息我们称为:异常信息。这个信息是JVM打印出来的。
-
java语言中异常是以什么形式存在的?
异常在java中是以类的形式存在,每一个异常类都可以创建异常对象。
如:
public class ExceptionTest02 { public static void main(String[] args) { //通过异常类实例化异常对象 NumberFormatException nfe=new NumberFormatException("数字格式化异常"); System.out.println(nfe);//java.lang.NumberFormatException: 数字格式化异常 //再通过异常类创建对象 NullPointerException npe=new NullPointerException("空指针异常"); System.out.println(npe);//java.lang.NullPointerException: 空指针异常 } }
2. UML
- java 的异常处理机制:
-
异常在java中以类和对象的形式存在。那么异常的继承结构是怎么样的?
-
我们可以使用UML图来描述一下继承结构。
-
画UML图有很多工具,例如:Rational Rose(收费的),startURL等…
-
什么是UML?有什么用?
-
UML是一种统一建模语言。
-
UML不是只有java中使用。只要是面向对象的编程语言,都有UML。
-
一般画UML图的都是软件架构师或者是系统分析师。这些级别的人员使用的。
-
在UML图中可以描述类和类之间的关系,程序执行的流程,对象状态等。
-
3.编译时异常和运行时异常
-
编译时异常:
所有Exception的直接子类,都叫做编译时异常。编译时异常是表示必须在编写程序的时候预先对这种异常进行处理,如果不处理编译器会报错。编译时异常又称为受检异常。
-
运行时异常:
运行时异常在编写程序阶段,你可以选择处理,也可以不处理。
4.异常处理的两种方式
-
java语言中对异常的处理包括两种方式:
第一种方式:在方法声明的位置上,使用thows关键字 抛给上一级。
第二种方式:使用try…catch语句进行异常的捕捉。
-
两种方式如何选择:
如果希望调用者来处理,选择throws上报。其他情况选择捕捉的方式。如:
public class ExceptionTest04 { //第一种处理方式:在方法声明位置上继续使用throws上抛 // public static void main(String[] args) throws ClassNotFoundException { //main方法中调用doSome(); //因为doSome()方法声明位置上有:throws ClassNotFoundException //我们在调用doSome()方法的时候必须对这种异常进行预先的处理。 //如果不处理,编译器就报错 //编译器报错: // doSome(); //} //第二种处理方式:try...catch捕获异常 public static void main(String[] args) { //main方法中调用doSome(); //因为doSome()方法声明位置上有:throws ClassNotFoundException //我们在调用doSome()方法的时候必须对这种异常进行预先的处理。 //如果不处理,编译器就报错 //编译器报错: try { doSome(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * doSome方法在方法声明的位置上:throws ClassNotFoundException * 这个代码表示doSome()方法在执行过程中,有可能会出现ClassNotFoundException异常。 * 叫类没找到异常。这个异常直接父类是:Exception 所有ClassNotFoundException属于编译时异常 * @throws ClassCastException */ public static void doSome() throws ClassNotFoundException{ System.out.println("doSome"); } }
-
异常捕捉和上报的联合使用:
/* * 处理异常的第一种方式:在方法声明的位置上使用throws关键字抛出,谁调用我这个方法,我就抛给谁。 * 抛给调用者来处理 * throws后面可以写多个异常:用逗号隔开 * */ public class ExceptionTest05 { //一般不建议在main方法上使用throws 因为这个异常一旦发生,JVM只有终止 //异常处理机制的作用就是增强程序的健壮性。怎么能做到异常发生了,也不影响程序的执行。 //所以一般main方法上的异常建议使用try..catch进行捕捉 public static void main(String[] args) { System.out.println("main begin"); try { //try尝试 m1(); } catch (FileNotFoundException e) { //这个分支中可以使用e引用,e引用保存的内存地址是那个new出来异常对象的内存地址 //catch是捕捉异常后走的分支 System.out.println("文件不存在,可能