一、异常的基本概念
java中异常类分为两种:Exception和Error两个子类,且它们都是Throwable的子类;
Exception:程序中可以用try{} catch(异常类 异常对象名){} finally{} 进行处理的,finally作为一场的统一出口,不管是否有异常都会执行此语句。
对象多态性中说道,子类的实例化可以直接使用父类的对象进行接收(向上转型)。在异常处理中,也应用了此概念,因try中产生的是一个实例化对象,若又其他异常无法知道的话,则可以最后使用Exception进行捕获。捕获粗的异常(Exception)放在细的异常(NullPiontException)之后,否则编译会出错!
当所有异常处理的方式是一样的时候就可以直接使用Exception进行捕获,当开发比较细的时候,不建议这样使用,需要区别对待。
问题:
由对象的多态性可以知道,异常类是Throwsable的子类,既然捕获Eception是最方便的,那么直接捕获Throwable可不可以?
首先这样的做法是可以的,但不利于开发,因为程序中的try只会跑出Exception的子类,而Throwable中不光有Excption还有Error。
Error:一般是JVM错误,在程序中无法处理
二、Throws和Throw关键字
在定义一个方法时可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理【如果再主方法上用throws,主方法不会处理任何异常,而是交给JVM进行处理,默认方式是使用JVM完成】
格式:
public 返回值类型 方法名称(参数列表) throws 异常类{}
class Math {// 定义除法操作,若果有异常,则交给被调用处处理
public int div(int i, int j) throws Exception {
int temp = i / j;// 可能出现异常
return temp;
}
}
public class ThrowsDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Math m = new Math();
try {
System.out.println("除法运算结果" + m.div(5, 0));// 调用处处理异常
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
throw关键字:throw的关键字作用是在本程序中抛出一个异常,抛出的时候是一个异常类的实例化对象
class Math {// 定义除法操作,若果有异常,则交给被调用处处理
public int div(int i, int j) throws Exception {
System.out.println("计算开始");
int temp = 0;
try {
temp = i / j;// 可能出现异常
return temp;
} catch (Exception e) {
throw e;//把异常的实例化对象抛出,让下面的方法调用处来处理异常
} finally {
System.out.println("计算结束");
}
}
}
public class ThrowsDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Math m = new Math();
try {
System.out.println("除法运算结果" + m.div(5, 0));// 调用处处理异常
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("异常产生了" + e);
}
}
}
三、RuntimeException和Exception的区别在java异常处理机制中:
Exception在程序中必须使用try catch 进行处理
runtimeexcption可以不用try catch 处理,但是出现异常则将由JVM进行处理
四、自定义异常类
只需要继承Exception就可以完成自定义异常类,因为在java中提供的都是标准异常类
五、断言功能
在JDK1.4之后,断言某一个程序的结果肯定是正确的,如果执行到断言语句时发现错误时则会提示。
断言格式:
assert boolean 表达式;
assert boolean 表达式:详细信息