异常
java.lang.Throwable类是 Java 语言中所有错误或异常的超类
-
Exception:编译期异常,进行编译java程序出现的问题
- RuntimeException:运行期异常,java程序运行过程中出现的问题
异常就相当于程序有个一个小毛病(感冒,发烧),把异常处理掉,程序可以继续执行(吃点药,继续革命工作),是可以处理的
- RuntimeException:运行期异常,java程序运行过程中出现的问题
-
Error:错误
错误就相当于程序得了一个无法治愈的毛病(非典,艾滋).必须修改源代码,程序才能继续执行
异常产生过程
代码示例
class ArrTool{
public static int getElement(int[] nArr,int nIndex){
int nElement=nArr[nIndex];
return nElement;
}
}
public class ExceptionDemo {
public static void main(String[] args) {
int[] arr = { 34, 12, 67 };
intnum = ArrayTools.getElement(arr, 4)
System.out.println("num=" + num);
System.out.println("over");
}
}
异常分析如下图
异常的处理
抛出异常
抛出异常使用关键字throw,throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行
- 使用格式:
throw new 异常类名(参数)
注意:
1. throw关键字必须写在方法的内部
2. throw关键字后边new的对象必须是Exception或者Exception的子类对象
3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
throw关键字后边创建的是RuntimeException或者是 RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch
代码示例
package cn.exception;
class ArrTool{
public static int getElement(int[] nArr,int nIndex){
//抛出异常
if(nIndex<0||nIndex>nArr.length-1){
throw new ArrayIndexOutOfBoundsException("兄嘚,下标越界了");
}
int nElement=nArr[nIndex];
return nElement;
}
}
public class ExceptionTest {
public static void main(String[] args){
int[] nArr={10,20,30};
int nNum=ArrTool.getElement(nArr,4);
System.out.println("nNum:"+nNum);
}
}
异常处理
那么对于调用者来说两种处理方式
- 一种就是继续讲问题声明出去,使用throws声明处理
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)
声明异常格式:方法 throws 异常类名1,异常类名2…{ }
**注意:**
1.throws关键字必须写在方法声明处
2.throws关键字后边声明的异常必须是Exception或者是Exception的子类
3.方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
4.调用了一个声明抛出异常的方法,我们就必须的处理声明的异常
要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
要么try...catch自己处理异常
代码示例
package cn.exception;
//自定义异常
class FileNotFoundException extends Exception{
//有参
FileNotFoundException(String strExcetionMess) {
super(strExcetionMess);
}
}
public class ExceptionTest {
//调用者main也不处理也是声明异常,让调用main函数的调用者处理,调用main函数的是jvm,所以交给jvm处理了
public static void main(String[] args) throws FileNotFoundException {
read("a.txt");
System.out.println("ok");
}
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String strPath) throws FileNotFoundException {
if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
// 如果不是 1.txt 认为 该文件不存在是一个错误 也就是异常则throw
throw new FileNotFoundException("文件不存在");
}
}
}
- 另一种是进行捕获处理(try-catch)
- 捕获异常语法如下
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}`
注意:try和catch都不能单独使用,必须连用
代码示例
package cn.exception;
//自定义异常
class FileNotFoundException extends Exception{
//有参
FileNotFoundException(String strExcetionMess) {
super(strExcetionMess);
}
}
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
try{// 当产生异常时,必须有处理方式。要么捕获,要么声明。
read("a.txt");
}catch (FileNotFoundException e) {//try中抛出的是什么异常,在括号中就定义什么异常类型
System.out.println(e);
}
//处理异常后程序继续向下执行
System.out.println("ok");
}
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String strPath) throws FileNotFoundException {
if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}
finally关键字
finally:因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的
例如:try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,必须关闭这些打开的资源
代码示例
package cn.exception;
//自定义异常
class FileNotFoundException extends Exception{
//有参
FileNotFoundException(String strExcetionMess) {
super(strExcetionMess);
}
}
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
try{
read("a.txt");
}catch (FileNotFoundException e){
//抓取到的是编译期异常 抛出去的是运行期
throw new RuntimeException(e);
}finally{
System.out.println("不管程序是否异常都要执行");
}
System.out.println("ok");
}
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String strPath) throws FileNotFoundException {
if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}
自定义异常
异常类定义:
- 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception
- 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException
代码示例
package cn.exception;
//自定义异常
class FileNotFoundException extends Exception{
//有参
FileNotFoundException(String strExcetionMess) {
super(strExcetionMess);
}
}
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
try{
read("a.txt");
}catch (FileNotFoundException e){
//打印异常信息
e.printStackTrace();
}
}
public static void read(String strPath) throws FileNotFoundException {
if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
throw new FileNotFoundException("文件不存在");
}
}
}