Exception类
Exception是Throwable的子类.
Exception的子类:
1>编译时期异常:只要不是RuntimeException中的异常都属于编译时期异常:比如IOException(IO流中),ParseException(解析时的异常).
2>运行时期异常:RuntimeException.例如:NullPointerException:空指针异常.(需要对对象进行非空判断)
处理异常:
1>标准格式:try...catch...finally:捕获异常.
变形格式: try...catch
try...catch...catch
try...finally...(多线程的时候:Lock锁')
经常使用的格式:
try{
可能出现问题的代码
}catch(异常类名 变量名){
输出语句处理.
}
存在多个异常的方法:
1>try{
可能出现多个问题的代码.
}catch(异常类名1 变量名1){
输出语句处理
}catch(异常类名2 变量名2){
输出语句处理
}....
2>try{
可能出现多个问题的代码.
}catch(异常类名1 |异常类名2|....变量名){
输出语句处理.
}
此格式的注意事项:
1>多个异常类名属于平级关系.
2>实际开发中,虽然有多个异常,但具体异常要给具体处理.
try里面的代码一旦出了问题,Jvm Java虚拟机就会针对这个问题抛出一个异常,然后和Catch里面所描述的异常进行匹配,如果一致,就会产生一个异常对象,然后处理这个异常对象,就会调用异常中的一些方法,try...catch语句结束.
常用给的方法:
public string getMessage():消息字符串.
public string toString():描述字符串:1>当前路径的全路径名称(值得是当前异常类名所在的全路径名称).2>": "(冒号和一个空格)
public void printStackTrace():该方法包含了消息字符串以及当前出现错误的异常的时候所描述哪个包下以及代码中具体的错误出现第几行.返回值void,直接输出在控制台.
捕获异常的标准格式:try...catch...finally
用法:finally经常在数据库中和IO流中用来释放资源.
finally中的代码一定会实现.除非Jvm退出了---->System.exit();
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class ExceptionDemo {
public static void main(String[] args) {
int a=10;
int b=0;
String str="2017-11-22";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
try {
System.out.println(a/b);
System.out.println(sdf.parse(str));
}catch (ParseException e) {
e.printStackTrace();
}catch(ArithmeticException e){
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
System.out.println("除数不能为0.");
}finally{
System.out.println("finally里代码一定会执行,try...catch里一旦出现异常配对成功,输出后跳出try...catch");
}
System.out.println("over");
}
}
结果为:
/ by zero
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
at weotes.ExceptionDemo.main(ExceptionDemo.java:13)
除数不能为0.
finally里代码一定会执行,try...catch里一旦出现异常配对成功,输出后跳出try...catch
over
面试题:
1>final,finalize,和finally的区别?
final:表示最终的,终态的;可以修饰类:类不能继承;可以修饰方法:成员方法不能重写;可以修饰成员变量:成员变量是一个常量;
finalize:它表示通过gc垃圾回收器回收一些不用的对象及变量.System.gc()的实质:就是重写Object类中的flnalize()方法.
finally:不能单独使用,和try..catch...finally中一起使用(异常,IO,数据库中使用),用来释放资源.另外finally中的代码一定会执行,除非Jvm退出.
2>如果catch里面有return语句,那么finally中的代码还会执行吗?如果会,那么在return前还是在return后?
会执行,在return前
相关代码:
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(get());
}
public static int get(){
int a=10;
try {
System.out.println(a/0);
a=20;
} catch (ArithmeticException e) {
a=30;
return a;
//代码执行到此处已经返回路径,所以finally里的代码要执行到return前.
}finally{
a=40;
}
return a;
}
}
结果为:
40
2>throws 抛出异常:在方法声明上抛出异常,由于编译时期异常,调用者必须处理.
相关代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ThrowsDemo {
public static void main(String[] args) throws ParseException {
methed();
try {
methed2();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void methed() throws ParseException{
String s="2017-11-22";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//解析
Date d=sdf.parse(s);
System.out.println(d);
}
public static void methed2(){
int a=10;
int b=0;
if(b==0){
System.out.println(a/b);
throw new ArithmeticException();//跟的异常对象
}else{
System.out.println("不会出现问题");
}
}
}
结果为:
Wed Nov 22 00:00:00 CST 2017
java.lang.ArithmeticException: / by zero
at weotes.ThrowsDemo.methed2(ThrowsDemo.java:27)
at weotes.ThrowsDemo.main(ThrowsDemo.java:11)
面试题:
throws和throw的区别:
throws :抛出,后面跟的是异常类名,可以跟多个异常类名,用逗号隔开;在方法声明上抛出,表示异常的一种可能性.
throw:抛出,后面跟的是异常对象,只能跟具体的一个异常对象,在方法语句上抛出,表示异常的绝对性.
异常的注意事项:
1>子类重写父类方法时,如果父类有抛出异常,那么子类重写这个方法时抛出异常不能比父类中该方法异常大.
2>子类重写父类方法时,如果父类没有抛出异常,那么子类重写这个方法时不能抛出异常,只能捕获异常.