java学习之路:29.异常处理
一.异常概述
学习Java时,常常会遇到编译程序后,提示出现异常,异常时一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
例如下面的代码:
public class Exceptiontest { public static void main(String[] args) { int num=3/0; System.out.println(num); }
}
- 1
- 2
- 3
- 4
- 5
运行结果提示算术异常:
程序运行过程中发生了异常,系统不再执行下去,提前结束,这就是异常。
Java语言是一门面向对象的编程语言,因此,异常在Java语言中也是作为类的实例的形式出现的。当某一方法中发生错误时,这个方法就会创建一个对象,并且把它传递给正在运行的系统,这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主流程的同时在其他方法处理异常。
常见的异常如下。
二.常见异常
异常类 | 说明 |
---|---|
ClassCastException | 类型转换异常 |
ClassNotFoundException | 没找到相应类异常 |
ArithmeticException | 算术异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
SQLException | 操作数据库异常类 |
NullPointerException | 空指针异常 |
NoSuchFieldException | 字段未找到异常 |
NoSuchMethodException | 方法未找到抛出的异常 |
NumberFormatException | 字符串转换为数字抛出的异常 |
NegativeArraySizeException | 数组元素个数为负数抛出的异常 |
StringIndexOutOfBoundsException | 字符串索引超出范围抛出的异常 |
IOException | 输入输出异常 |
IllegalAccessException | 不允许访问某类异常 |
InstantiationException | 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。 |
EOFException | 文件已结束异常 |
FileNotFoundException | 文件未找到异常 |
三.捕捉异常
Java语言的异常捕捉结构由try,catch,finally三个部分构成,其中try语句块中存的是可能发生异常的Java语句,catch程序块在try语句块之后,用来激发被捕捉的异常,finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块,异常处理器大致分为 try-catch 语句块和 finally 语句块。
1. try-catch 语句块
将代码稍稍改动:
public class Exceptiontest { public static void main(String[] args) { int num=3/0; System.out.println(num); System.out.println("继续运行"); }
}
- 1
- 2
- 3
- 4
- 5
- 6
运行可知,一旦出现异常会终止出现运行。
在添加了异常处理tyr-catch语句块之后:
public class Exceptiontest { public static void main(String[] args) { try { int num=3/0; System.out.println(num); }catch(Exception e) { e.printStackTrace(); } System.out.println("继续运行"); }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
运行结果可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。
Exception是try代码块传递给catch代码块的变量类型,e是变量名,catch代码块中的语句“e.printStackTrace()方法用于指出异常的类型,性质,栈层次已经出现在程序中的位置。”另外两个方法如下:
getMessage() : 输出错误性质
toString() : 给出异常的类型与性质。
2.finally 语句块
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之间的try-catch 语句块是否顺序执行完毕,都会执行finally语句。
在以下4种特殊情况下,finally块不会被执行:
在finally语句中发生了异常
在前面的代码中使用了System.exit()退出程序
程序所在的线程死亡
关闭CPU
四.自定义异常
除了内置的异常类,用户也可以自定义异常,只需要继承Exception类即可。
步骤如下:
1.创建自定义异常类。
2.在方法中通过throw关键字抛出异常对象。
3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕捉并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4.在出现异常的调用者中捕捉并处理异常。
例如:
//创建自定义异常类
class MyException extends Exception{ public MyException(String ErrorMessage) { super(ErrorMessage); }
}
//在方法中通过throw关键字抛出异常对象
public class Exceptiontest { static int avg(int number1,int number2) throws MyException{ if (number1 < 0 || number2 < 0) { throw new MyException("不可以使用负数"); } if (number1 > 100 || number2 > 100) { throw new MyException("数值太大了"); } return (number1 + number2); } public static void main(String[] args) { try { int num =avg(155,155); System.out.print(num); }catch(MyException e) { System.out.println(e); } }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
运行结果:
五.在方法中抛出异常
1.使用throws关键字抛出异常
throws 关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号分隔。
如:
int avg(int number1,int number2) throws MyException{
// 。。。。。。
}
- 1
- 2
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
2.使用throw关键字抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,他后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指名要抛出的异常,如果要捕捉throw抛出异常,则必须使用try-catch语句块。
如:
if (number1 < 0 || number2 < 0) { throw new MyException("不可以使用负数"); }
- 1
- 2
若有错误,欢迎指正批评,欢迎批评。
每文一句:生活不能等别人来安排,要自已去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。——路遥《平凡的世界》
文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Fdog_/article/details/104747293
- 点赞
- 收藏
- 关注作者
评论(0)