异常概述与Error的区别
异常(Exception):异常指的是程序运行时发生的不正常事件;异常能够被程序处理,保证程序继续运行下去;例如除数为0、文件没有找到、输入的数字格式不对……
错误(Error):错误程序没法处理,例如内存泄漏。发生错误后,一般虚拟机会选择终止程序运行,程序员需要修改代码才能解决相关错误。
异常举例
public class ExcptionTest {
public void test(){
System.out.println("====运行前====");
int a=10/0;
System.out.println("====运行后====");
}
public static void main(String[] args) {
ExcptionTest et= new ExcptionTest();
et.test();
}
}
运行结果:
(在运行期我们int型的a 被除以0 那么 这样的事件称之为不正常事件,将发生异常,异常不是错误,是不正常的事情,错误往往是跟源代码的BUG 或者内部环境有关,)
错误:
1.错误是很难处理的,比如内存溢出等,不能够通过异常处理机制来解决。
2.错误是不能被处理的,它必须秀给源代码,编译通过才能被执行
错误示例:
异常分类
1.Throwable:可抛出的
2.Error:错误
Excertion:异常
RuntimeException:运行时异常
IOException:输入输出异常
SQLException:数据异常
indexOutOfBoundsException:索引越界
NullpointerException:空指针异常
try/catch/finally定义及使用
try:检测不安全的代码块(发现异常),try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代码放到try块中,因为随时可能会中断执行。
try{
可能会发生异常的代码
}
catch:把抓到的类型匹配的异常捕获,保证程序能继续运行下去,catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,一个try后面可以写多个catch,分别捕获不同类型的异常。
catch(异常类型 引用名){
异常处理代码
}
finall:finally该内容总是会执行的,只能有一个finally语句.
基本语法
try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码
}finally{
必须执行代码
}
finally与renturn区别
1.在try中没有异常的情况下try、catch、finally的执行顺序 try — finally
2.如果try中有异常,执行顺序是try — catch — finally
3.如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally — return
4.如果try中有异常 并且try中有return这时候正常执行顺序是try----catch—finally— return
5.如果try有异常,相应catch中有return,顺序是try—catch—finally—return
throw与throws
throw
关键字throw用于显式抛出异常
抛除异常后处理
使用try-catch捕获异常
使用throws声明异常
语法
throw new 异常类构造方法;
例如:throw new Exception();
利用抛出的异常来标记不正常的事件,从而对事件流统一处理
static int avg(int n1,int n2)throws Exception{
if (n1<0||n2<0) { //判断方法参数是否满足条件
throw new Exception("不能使用负数");//错误信息
}
if (n1>100||n2>100) {
throw new Exception("数值太大了");
}
return (n1+n2)/2; // 将参数的平均值返回
}
throws
用于方法声明处,指出方法引发的异常。
可以声明多种异常类型,用逗号分开即可。
示例
public void test throws 异常1,异常2,异常3{
}
throws解析:
1.任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
2.子类覆盖父类中的方法,子类方法不能声明抛出比父类范围更大的异常。
3.使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明
4.throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常, 要么使用throws声明异常
5.throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常
public class Calculator {
public void div(int x,int y) throws Exception{
//当除数为0时,抛出异常
if(y==0){
throw new Exception(); //使用throws后,不再有编译错误
}
System.out.println("x/y="+x/y);
}
}
自定义异常
1.自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的子类
2.作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆
3.自定义异常类中往往不写其他方法,只重载需要使用的构造方法
4.可以用throw抛出自定义异常对象,使用throws声明自定义异常类型;
5.可以使用try/catch/finally处理异常
public class DataValueException extends Exception {
public DataValueException() {
}
public DataValueException(String message) {
super(message);
}
public DataValueException(Throwable cause) {
super(cause);
}
public DataValueException(String message, Throwable cause) {
}