Java的异常机制
Java中的错误的顶级类:Throwable类
Thorwable下派生了两个子类
Error和Exception
Error:错误,通常是虚拟机级别的异常.程序(通过我们的代码)无法解决.
Exception:异常,程序级别的异常
我们可以通过代码的形式捕获异常,并进行相应的处理.
Try关键字:
Try{}:语句块
Try语句块中包含的应该是可能引发异常的程序片段.
Catch关键字:
Catch(){}:捕获块
Catch块是紧跟在try后面的,可以出现多个.每一个catch会列举在try块中的代码可能出现的一种错误.一旦try块中的代码出现了该种错误,就会进入当前catch块,在catch块中我们来编写解决该异常的代码片段.若try块中的代码运行时没有出现任何异常,所有catch块均被忽略,不会被执行.
Java异常
当JVM运行程序时,在某一句代码运行时出现了异常,jvm就会实例化该类异常的一个实例并抛出错的该句代码外,这时会检查调用该句代码的方法是否对该句代码进行了try捕获,若有则依次检查catch直到发现可以解决的catch片段.若没有try块或者catch没有解决该异常,则继续向该方法外面抛出,然后按照上述描述检查并解决.若最终没有任何解决措施而抛至main方法外,则jvm停止该程序.
throw关键字
throw后面紧跟一个异常实例.作用是向外主动抛出一个异常.
获取错误信息
String e.getMessage();
向控制台输出错误堆栈信息
e.printStackTrace();
throws关键字
Throws关键字用来在声明方法时同时声明该方法可能抛出的异常,通知调用者必须捕获这些异常.
通常情况下,程序中throw的异常都要在方法声明时通过throws告知调用者.但是RuntimeException及其子类例外.
/**
* 因为不符合逻辑而当异常去看待
* @author Administrator
*
*/
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
if(age<0||age>200){
throw new Exception("年龄不合法");
}
this.age = age;
}
public static void main(String[] args){
Person p=new Person();
try {
p.setAge(999);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
finally关键字
finally块:出现在try,catch的最后,只能出现一次.
finally无论如何都会执行!
通常我们会将无论程序是否出错都要执行的语句放到finally中,以保证可以执行到.
模拟数据库
**
public class TestFinally {
public static void main(String[] args) {
try{
String ip=null;
System.out.println("连接数据库");
if(ip==null){throw new RuntimeException("操作数据库失败");}
System.out.println("保存数据");
}catch(Exception e){
System.out.println("操作数据库失败");
}finally{
System.out.println("关闭数据库连接");//无论是否报错,必须要关闭数据库
}
}
}
看看下面应该输出什么
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(
test(null)+","+test("0")+","+test("")
);
}
public static int test(String str){
try{
return str.charAt(0)-'0';
}catch(NullPointerException e){
System.out.println("空指针");
return 1;
}catch(RuntimeException e){
System.out.println("运行时异常");
return 2;
}catch(Exception e){
System.out.println("就是个异常");
return 3;
}finally{
return 4;
}
}
}
其实会输出:(
空指针
运行时异常
4,4,4
)
所以请注意,finally中不要写返回语句,否则方法无法返回正确结果.