当程序出现一些问题,可以是严重问题,可以是一种异常,将这些统称为Throwable
Throwable 类是 Java 语言中所有错误或异常的超类
Throwable分为 error 和 exception
举例:
张三去山上旅行
1)张三骑车去旅行,山路崩塌了,不能前行了----->不可抗力因素
2)张三骑车去旅行,骑着发现轮胎没气了------->需要检查的问题
3)骑着,山路有石子,他就非得往石子上骑,导致车胎没气了---->自己原因造成的,no zuo no die
(1)不抗力因素----->error:属于严重问题 内存溢出了 (加载页面中大量图片的时候,程序会挂掉)
(2)异常:
编译时期异常:只要出现的不是运行时期异常,统称为编译时期
编译时期异常:开发者必须处理!
运行时期异常:RuntimeException
编译通过了,但是开发者代码不严谨(NullPointerException等等...)
一.异常的处理
异常的处理分为两种:
1)try...catch...finally (标准格式) :捕获异常
2)throws ... 抛出异常
1. 第1)种形式的变形格式...
*try...catch...
*try...catch...catch...
*catch....
try{
一些代码
try里面的代码越少越好
代码包含了可能会出现问题的代码
}catch(异常类 异常类对象){
try出现异常了,描述的异常刚好就是catch的异常类,就会执行catch里面代码
//处理异常
}
public static void main(String[] args) {
int a = 10 ;
int b = 0 ;
try {//捕获到
//出现问题的代码
System.out.println(a/b);
}catch(ArithmeticException e) { //ArithmeticException e = new ArithmeticException() ;
//用输出语句来处理异常
System.out.println("除数不能0");
// e.printStackTrace();
}
System.out.println("over");
}
如何处理多个异常?
两个或两个以上的异常的时候怎么办?
try{
可能出现问题的代码
}catch(异常类名1 对象名1){
//异常处理
}catch(异常类名2 对象名2(){
//异常处理
}
public static void main(String[] args) {
int a = 10 ;
int b = 0 ;
int[] arr = {1,2,3} ;
try {
//产生一个异常对象
System.out.println(arr[3]);
System.out.println(a/b);
System.out.println("代码可能到这一步出现了问题,怎么办?");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("访问了数组中不存在的角标");
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception e) { //爷爷 (最大的类一定在最后)
System.out.println("程序出问题了....");
}
}
从上述例子看出:两个异常的处理:直接进行处理,不用分别try...catch
*编译时期异常和运行时期异常的区别?
编译时期:开发者必须进行显示处理,不处理,编译不能通过,
运行时期异常:无需进行显示处理,可以像编译时期一样进行处理
2.处理处理异常的第二种方式:使用throws 抛出异常 (跟在方法的后面)
xxx 返回值 方法名() throws 异常类名{
}
public static void main(String[] args) throws ParseException {
System.out.println("今天天气很好!");
method1(); //运行时期调用者不需要处理的
System.out.println("但是不该有雾霾....");
method2(); //对于编译器时期异常,调用者必须处理的,不处理不行
}
private static void method2() throws ParseException {
String str = "2018-5-12" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
Date d = sdf.parse(str) ; //编译时期异常
System.out.println("d:"+d);
}
private static void method1() { //throws:表示可能出现问题
int a = 10 ;
int b = 0 ;
try {
System.out.println(a/b);
}catch(ArithmeticException e) {
// System.out.println("除数不能为能为0");
e.printStackTrace();
}
}
二.异常的一些注意事项
1.对于标准格式
try{
... }catch(异常类 对象){
// 异常处理
}
执行try里面的代码 ,如果出现了问题,它会通过代码的问题创建一个异常对象,然后通过异常对象和catch里面的异常类是否一致
如果一致的情况,就会出现catch里面的代码,执行Throwable里面的方法
public String getMessage() :消息字符串
public String toString(): 异常的简短描述 ": ":由冒号和空格组成
public void printStackTrace():返回值void 直接调用, 包含了消息字符串,还有": "信息描述,具体出现异常的代码定位以及定位的源码上
public static void main(String[] args) {
//定义日期文本格式
try {
String strDate = "2018-6-20" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
//解析
Date d = sdf.parse(strDate) ; //
System.out.println(d);
}catch(ParseException e) { //创建一个异常对象:PareException e = new ParseException() ;
//使用throwable里面的一些方法
// String str = e.getMessage() ;
// System.out.println(str);//Unparseable date: "2018-6-20"
/*String str = e.toString() ;//简单描述
System.out.println(str);//包名.类名: getMessage() ;
*/
//public void printStackTrace():返回值void 直接调用(输出在控制台的), 包含了消息字符串,还有": "
// * 信息描述,具体出现异常的代码定位以及定位的源码上
e.printStackTrace();
}
System.out.println("日期解析完毕...");
}
2.final,finally,finalize的区别?
final:可以修饰类,该类不能被继承;可以修饰变量,该变量是常量;可以修饰成员方法,该方法重写
finalize:gc():运行垃圾回收器,实际是调用finalize()方法,和垃圾回收器有关系
finally:在io,数据库中以及后面对数据库操作(DBUtuls/c3p0/Hibernate/MyBatis)里面中释放资源的