java基础之异常
Posted 暮尘时雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础之异常相关的知识,希望对你有一定的参考价值。
一、Throw(抛出异常,让调用者处理)
Throw(将异常抛给调用者)
在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?
1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw 就可以完成。
throw 异常对象。
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
public?class?ThrowDemo?{ ????
public?static?void?main(String[]?args)?{ ????????
//创建一个数组? ????????
int[]?arr?=?{2,4,52,2}; ????????
//根据索引找对应的元素? ????????
int?index?=?4; ????????
int?element?=?getElement(arr,?index); ? ????????
System.out.println(element); ????????
System.out.println("over");
}?
public?static?int?getElement(int[]?arr,int?index){? ???????
//判断??索引是否越界 ? ????????
if(index<0?||?index>arr.length‐1){ ?????????????
???/* ?????????????
判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。 ?????????????
这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。? ??????????????
*/ ???????????
throw?new?ArrayIndexOutOfBoundsException("哥们,角标越界了~~~"); ????????} ????????
int?element?=?arr[index]; ????????
return?element; ????
}
}???
二、Throws(声明异常),,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
修饰符?返回值类型?方法名(参数)?throws?异常类名1,异常类名2…{???}
public?class?ThrowsDemo?{ ????
public?static?void?main(String[]?args)?throws?FileNotFoundException?{ ????????
read("a.txt"); ????
} ? ????
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {
//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}
三、 捕获异常try…catch,捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
格式:
try{ ?????
编写可能会出现异常的代码
}catch(异常类型??e){ ?????
处理异常的代码 ????
//记录日志/打印异常信息/继续抛出异常
}
演示:
public?class?TryCatchDemo?{ ????
public?static?void?main(String[]?args)?{ ???????
try?{
//?当产生异常时,必须有处理方式。要么捕获,要么声明。 ????????????
read("b.txt"); ????????
}?catch?(FileNotFoundException?e)?{
//?括号中需要定义什么呢? ??????????
//try中抛出的是什么异常,在括号中就定义什么异常类型 ?? ????????????
System.out.println(e); ????????
} ????????
System.out.println("over"); ????
} ?
/** ?????
*?我们?当前的这个方法中?有异常??有编译期异常 ?????
*/ ????
public?static?void?read(String?path)?throws?FileNotFoundException?{ ????????
if?(!path.equals("a.txt"))?{
//如果不是?a.txt这个文件? ????????????
//?我假设??如果不是?a.txt?认为?该文件不存在?是一个错误?也就是异常??throw ???????????? ??
? throw?new?FileNotFoundException("文件不存在");
}
}
}
四、 ?nally 代码块:有一些特定的代码无论异常是否发生,都需要执行
?nally的语法: try...catch....?nally:自身需要处理异常,终还得关闭资源。
?
public?class?TryCatchDemo4?{ ????
public?static?void?main(String[]?args)?{ ????????
try?{ ????????????
read("a.txt"); ???????
}?catch?(FileNotFoundException?e)?{ ????????????
//抓取到的是编译期异常??抛出去的是运行期? ????????????
throw?new?RuntimeException(e); ????????
}?finally?{ ????????????
System.out.println("不管程序怎样,这里都将会被执行。"); ????????
} ????????
System.out.println("over"); ???
} ????
/* ?????
* ?????
*?我们?当前的这个方法中?有异常??有编译期异常 ?????
*/ ????
public?static?void?read(String?path)?throws?FileNotFoundException?{ ????????
if?(!path.equals("a.txt"))?{
//如果不是?a.txt这个文件? ???????????
//?我假设??如果不是?a.txt?认为?该文件不存在?是一个错误?也就是异常??throw ????????????
?throw?new?FileNotFoundException("文件不存在");
}
}
}
五、异常注意事项
多个异常使用捕获又该如何处理呢?
1. 多个异常分别处理。
2. 多个异常一次捕获,多次处理。
3. 多个异常一次捕获一次处理
try{ ?????
编写可能会出现异常的代码
}catch(异常类型A??e){??当try中出现A类型异常,就用该catch来捕获. ?????
处理异常的代码 ?????
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B??e){??当try中出现B类型异常,就用该catch来捕获. ?????
处理异常的代码 ?????
//记录日志/打印异常信息/继续抛出异常
}
六、自定义异常
原因:发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中 没有定义过,例如年龄负数问题,考试成绩负数问题.那 么能不能自己定义异常呢?
异常类如何定义:
1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。
案例:
//?业务逻辑异常
public?class?RegisterException?extends?Exception?{ ????
/** ?????
*?空参构造 ?????
*/ ????
public?RegisterException()?{} ? ????
/** ?????
* ?????
*?@param?message?表示异常提示 ?????
*/ ????
public?RegisterException(String?message)?{ ????????
super(message); ????
}
}
以上是关于java基础之异常的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段