------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常
概念
阻止当前方法或者作用域继续执行的问题。
异常结构图:
1Throwable有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
-
1.1Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。
-
1.2Exception(异常):是程序本身可以处理的异常。常见的异常有:NullPointerException(空引用)、ArrayIndexOutOfBoundException(数组越界)。
运行时异常
都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
非运行时异常
是 RuntimeException以外的异常,类型上都属于Exception类及其子类,这类异常必须进行处理,不处理,程序编译不能通过。
异常和错误的区别:
异常能被程序本身可以处理,错误是无法处理。
异常的处理机制
1.抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处
置异常的代码并执行(方法中抛出都必须使用throws字句)。
1throws抛出异常:如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。
示例:抛出除数为0的异常
package ExceptionDemo1;
class Div
{
int div(int a, int b) throws Exception
{
return a / b;
}
}
public class ExceptionDemo2
{
public static void main(String[] args) throws Exception
{
Div d = new Div();
int x = d.div(4, 0);
System.out.println("X = " + x);
}
}
Throws抛出规则
-
1如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
-
2必须声明方法可抛出的任何可查异常(checked exception)。
-
3仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。
-
4调用方法必须遵循任何可查异常的处理和声明规则。
-
2throw抛出异常:throw总是出现在函数体中,用来抛出一个Throwable类型的异常。
示例:抛出除数为0的RuntimeException异常。
package ExceptionDemo1;
class Div
{
int div(int a, int b) throws Exception
{
return a / b;
}
}
public class ExceptionDemo2
{
2捕获异常
public static void main(String[] args) throws Exception
{
Div d = new Div();
try
{
int x = d.div(4, 0);
System.out.println("X = " + x);
}
catch (Exception e)
{
throw new RuntimeException("除数不能为0");
}
}
}
在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)用try、catch和finally语句捕获异常,异常总是先有地方抛出,才能捕获。try-catch-fina语句格式
try
{
//可能发生异常的程序代码。
}
catch(异常类型1)
{
//捕获并处置try抛出的异常类型1
}
catch(异常类型2)
{
//捕获并处置try抛出的异常类型2
}
finally
{
//无论try出现异常还是不会出现异常程序一定会处理的的代码
//1在finally语句块中发生了异常。
//2在前面的代码中用了System.exit()退出程序。
//3程序所在的线程死亡。
//4关闭CPU。
}
try块:用于捕获异常
catch块:用于处理try捕获的异常。
finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。
示例:捕捉除数为0
package ExceptionDemo1;
class Div
{
int div(int a, int b) throws Exception
{
return a / b;
}
}
public class ExceptionDemo1
{
public static void main(String[] args)
{
Div d = new Div();
try
{
int x = d.div(4, 0);
System.out.println("X = " + x);
}
catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
}
}
}
2Throwable类中的常用方法
-
1.getCause():返回抛出异常的原因。
-
2.getMeage():返回异常的消息信息。
-
3.printStackTrace():对象的堆栈跟踪输出至错误输出流。
3常见的异常类
1、RuntimeException子类
-
1.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出(开发中经常出现)。
-
2.ArithmeticException:术条件异常。譬如:整数除零等。
-
3.ClassNotFoundException:找不到类异常。
-
4.NegativeArraySizeException:数组长度为负异常。
-
5.ArrayStoreException:数组中包含不兼容的值抛出的异常。
-
6.SecurityException:安全性异常。
-
7.IllegalArgumentException:非法参数异常。
2、IOException()
-
1.IOException:操作输入流和输出流时可能出现的异常。
-
2.EOFException:文件已结束异常。
-
3.FileNotFoundException:文件未找到异常。
3、其他异常
-
1.ClassCastException:类型转换异常类(开发中经常出现)。
-
2.ArrayStoreException:数组中包含不兼容的值抛出的异常。
-
3.SQLException:操作数据库异常类。
-
4.NoSuchFieldException:字段未找到异常。
-
5.NoSuchMethodException:方法未找到抛出的异常。
-
6.NumberFormatException:字符串转换为数字抛出的异常。
-
7.StringIndexOutOfBoundsException:字符串索引超出范围抛出的异常(开发中经常出现)。
-
8.IllegalAccessException:不允许访问某类异常。
-
9.InstantiationException:当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。
4自定义异常
步骤:
1.创建自定义异常类。
2.在方法中通过throw关键字抛出异常。
3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4.在出现异常方法的调用者中捕获并处理异常。
示例:抛出除数为0的MyException异常。
package ExceptionDemo1;
class MyException extends Exception
{
public MyException(String msg)
{
super(msg);
}
}
class Div
{
int div(int a, int b) throws MyException
{
return a / b;
}
}
public class ExceptionDemo3
{
public static void main(String[] args)throws MyException
{
Div d = new Div();
try
{
int x = d.div(4, 0);
System.out.println("X = " + x);
}
catch (Exception e)
{
throw new MyException("除数不能为0");
}
}
}