学习Java时,常常会遇到编译程序后,提示出现异常,异常时一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
例如下面的代码:
public class Exceptiontest {
public static void main(String[] args) {
int num=3/0;
System.out.println(num);
}
}
运行结果提示算术异常:
程序运行过程中发生了异常,系统不再执行下去,提前结束,这就是异常。
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 语句块。
将代码稍稍改动:
public class Exceptiontest {
public static void main(String[] args) {
int num=3/0;
System.out.println(num);
System.out.println("继续运行");
}
}
运行可知,一旦出现异常会终止出现运行。
在添加了异常处理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("继续运行");
}
}
运行结果可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。
Exception是try代码块传递给catch代码块的变量类型,e是变量名,catch代码块中的语句“e.printStackTrace()方法用于指出异常的类型,性质,栈层次已经出现在程序中的位置。”另外两个方法如下:
getMessage() : 输出错误性质
toString() : 给出异常的类型与性质。
完整的异常处理语句一定要包含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);
}
}
}
throws 关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号分隔。
如:
int avg(int number1,int number2) throws MyException{
// 。。。。。。
}
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,他后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指名要抛出的异常,如果要捕捉throw抛出异常,则必须使用try-catch语句块。
如:
if (number1 < 0 || number2 < 0) {
throw new MyException("不可以使用负数");
}
若有错误,欢迎指正批评,欢迎批评。
每文一句:生活不能等别人来安排,要自已去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。——路遥《平凡的世界》