目录
五: try...catch...finally处理多级异常
一:Java中的异常:Throwable
严重的问题:Error,一般情况下,我们不处理,这样的问题一般都是很严重,
比如OOM,内存溢出问题。
问题:异常:Exception
运行时异常:RuntimeException(运行时异常),这样的问题我们也不处理,因为这种问题一般都是你自己写代码出现的问题比如代码不够严谨
例如:int a =12;
int b =0;
System.out.println(a/b);
在写程序时不会报错但是运行时会出现错误java.lang.ArithmeticException: / by zero
编译时异常:除了不是RuntimeException都是编译时异常,必须要进行处理,如果你不处理,
程序编译就不通过,无法运行。如图:
二:异常分类
三:JVM的默认处理方案
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行。
四:异常处理方案
1: try...catch...finally
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理;
}finally{
释放资源的代码;
}
变形格式:
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理;
}
package day30;
public class Test2
{ public static void main(String[] args) {
int a =0;
int b =1;
try{
System.out.println(b/a);
}catch (ArithmeticException e){
System.out.println("出现错误了");
}
}}
结果:
出现错误了
Process finished with exit code 0
2:throws
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。
3:throw
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
4:注意事项
1、try里面的代码尽量不要太多
2、catch里面必须要有内容,哪怕只是有一句简单提示语句
五: try...catch...finally处理多级异常
1)每个异常都写一个try...catch
2)写一个try,多个catch
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的处理;
}catch(异常的类名 变量名){
针对问题的处理;
}...
public class Test2
{ public static void main(String[] args) {
int[] a={1,2,3,4,5,6,7,8,9};
int x=0;
int y=12;
try{
System.out.println(a[10]);
System.out.println(y/x);
}catch (ArithmeticException e){
System.out.println("除数不能为0");
}
catch (ArrayIndexOutOfBoundsException e1){
System.out.println("数组下标越界");
}
}
}
数组下标越界
Process finished with exit code 0
//由于出现错误以后后面的就不输出所以只输出了第一个catch中的语句。
3)JDK7的新特性及注意事项
新特性处理多个异常
try{
可能会出现问题的代码;
}catch(异常类名1|异常类名2|... 变量名){
处理异常的提示;
}
package day30;
public class Test2
{ public static void main(String[] args) {
int[] a={1,2,3,4,5,6,7,8,9};
int x=0;
int y=12;
try{
System.out.println(a[10]);
System.out.println(y/x);
}catch (ArithmeticException| ArrayIndexOutOfBoundsException e){
System.out.println("出错了");
}
}
}
出错了
Process finished with exit code 0
注意:
1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针对多种类型的问题,只给出了一种解决方案。
2、多个异常的类型之间必须是平级关系
4)注意事项:
1、能明确异常的类型的时候尽量明确,不要用父类大的作处理
2、平级的关系,多个catch异常没有前后顺序关系,谁在前谁在后无所谓,一旦出现了父类继承的关系,父必须在后。
3、一旦try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序后面的代码,
但是try里面的代码就停在了出现问题的那一步。
六:throws和throw的区别
throws: 用在方法声明的后面,跟的是异常的类名。
可以跟多个异常类名,用逗号隔开
表示的是抛出异常,由该方法的调用者处理
throws表示的是出现异常的一种可能性,为了程序的正常运行,我们选择抛出给调用者处理
不一定会发生这种异常
throw:用在方法体内,跟着的是异常的对象。
只能抛出一个异常对象。
表示的时候抛出异常,由方法体内的语句做处理。
throw表示的是一定出现了某种异常。
七:Throwable中的方法
getMessage()
获取异常信息,返回字符串。
toString()
获取异常类名和异常信息,返回字符串。
返回此可抛出的简短描述。 结果是:
这个对象的类的name
+“:”(一个冒号和一个空格)
+ 调用这个对象的getLocalizedMessage()方法的结果
对于不重写此方法的子类,默认实现返回相同的结果为getMessage() 。
package day30;
public class Test2
{ public static void main(String[] args) {
int x=0;
int y=12;
try{
System.out.println(y/x);
}catch (ArithmeticException e){
//获得异常信息和异常类名输出
String message = e.getMessage();
String s = e.toString();
System.out.println(message+s);
}
}
}
/ by zerojava.lang.ArithmeticException: / by zero
Process finished with exit code 0
printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
package day30;
public class Test2
{ public static void main(String[] args) {
int x=0;
int y=12;
try{
System.out.println(y/x);
}catch (ArithmeticException e){
//调用printStackTrace输出异常信息
e.printStackTrace();
}
}
}
java.lang.ArithmeticException: / by zero
at day30.Test2.main(Test2.java:9)Process finished with exit code 0
八: final,finally和finalize的区别
final:最终的意思,可以修饰类,成员变量,成员方法
修饰类:类不能被继承
修饰成员变量:变量就是常量
修饰成员方法:方法不能被重写
finally:是处理异常的一部分,一般情况下用于释放资源的作用,一般来说都会执行
特殊情况下:在执行finally之前JVM就停了(System.exit(0))
finalize:是Object类中的一个方法,用于手动垃圾回收,但是不一定会立即回收