1、 异常是什么?
异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象。 ——百度百科
异常,它代表这一个错误的产生,又可以代表一个消息。
2、异常体系
首先我们可以把异常当做一个对象来看待。
JAVA中定义了这么一个类 java.lang.Throwable 。他是所有所有异常的父类。
Throwable之下可以分成Error以及Exception。
Error:代表的是比较严重的错误,这个问题不是程序能解决的。而是java虚拟机抛出的,这种问题出现了就让它挂了吧,因为解决不了,比如内存溢出什么的,这种问题出现的时候,JVM就让程序停下来了。
Exception:异常又分成运行时异常和非运行时异常。
这个通常是需要程序员进行处理的部分。
运行时异常既 RunTimeException 及其子类,如 空指针异常(NullPointerException)、下标越界异常(IndexOutOfBoundsException)、算术异常(ArithmaticException)、类型转换异常(ClassCastException)
非运行时异常:是程序员必须要处理的异常,没有处理的话程序无法编译通过。
3、异常处理
异常处理用到的几个关键字 try、catch、finally、throw、throws
- try – 将可能出现异常的代码块放在这个区域中,try会对try块中的代码进行监控,如果运行正常,会在运行结束后正常向下运行。如果监控到异常,会将异常抛出。
- catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
- finally – finally块是肯定会被执行的部分。经常被用来回收try中打开的资源。只有finally块执行结束之后才会返回执行try或者catch块中的return或者throw语句。所以如果在finally中使用了return的话,那么异常信息将被隐藏。
- throw – 抛出异常
- throws – 在方法签名中使用,用于声明该方法可能抛出的异常。
Demo1:try…catch 的基本用法
public class demo1{
public static void main(String[] args){
try{
int 10/0;
System.println.out("i="+i);
}catch(Exception e){
// 对异常的处理
System.out.println("Caught Exception");
System.out.println("e.getMessage(): " + e.getMessage());
System.out.println("e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
}
}
}
运行结果:
Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:6)
Demo2:finally的基本用法
public class Demo2 {
public static void main(String[] args) {
try {
int i = 10/0;
System.out.println("i="+i);
} catch (ArithmeticException e) {
System.out.println("Caught Exception");
System.out.println("e.getMessage(): " + e.getMessage());
System.out.println("e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
} finally {
System.out.println("run finally");
}
}
}
运行结果
Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
at Demo2.main(Demo2.java:6)
run finally
Demo3 throw以及throws的基本用法。
class MyException extends Exception {
public MyException() {}
public MyException(String msg) {
super(msg);
}
}
public class Demo3 {
public static void main(String[] args) {
try {
test();
} catch (MyException e) {
System.out.println("Catch My Exception");
e.printStackTrace();
}
}
public static void test() throws MyException{
try {
int i = 10/0;
System.out.println("i="+i);
} catch (ArithmeticException e) {
throw new MyException("This is MyException");
}
}
}
运行结果
Catch My Exception
MyException: This is MyException
at Demo3.test(Demo3.java:24)
at Demo3.main(Demo3.java:13)