1.java异常分类
java异常分为两大类:checked异常与unchecked异常,其中unchecked异常又叫运行时异常
(1)unchecked异常
即RuntimeException(运行时异常),不需要try……catch……或throws机制去处理的异常
(2)checked异常
除了RuntimeException,其他继承自java.lang.Exception的异常统称为Checked Exception。对于checked异常的处理方式有以下两种
1)当前方法知道如何处理该异常,使用try……catch块来捕获异常
2)当前方法不知道如何处理这种异常,在定义该方法时抛出异常,抛出异常有throws与throw
java常见的异常类之间的继承关系
2.异常处理机制
2.1try……catch
(1)try块后可以有多个catch块,用来捕获不同的异常,注意,一定是先捕获小异常再捕获大异常
(2)一个catch块可以捕获多种类型的异常,多种异常间用“|”隔开
如:
try{
}catch(NumberFormatException | IndexOutofBoundsException)
2.2 使用throws声明抛出异常
使用throws抛出异常的思路是当前方法不知道如何处理这些类型的异常。throws声明抛出异常只能在当前方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间用逗号隔开。
用法如下:
public void methords() throws IOException,Exceptionclass1,……
2.2 throw
如果需要在程序中自行抛出异常,则应使用throw语句,hrow语句抛出的是一个异常实例
如:
throw new Exception("异常抛出");
2.3 throws与throw的区别
(1)throw 是语句抛出一个异常;throws 是方法抛出一个异常;
(2)throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单
独使用,然后再由处理异常的方法捕获。
2.4 自定义异常类
用户自定义异常类都继承Exception基类,如果要自定义unchecked异常类,则应该继承RuntimeException基类。定义异常类时需要提供两个构造器:一个是无参数的构造器,一个是有一个字符串参数的构造器,该字符串作为异常对象的描述信息,也就是异常对象的getMessage()方法的返回值。
举例:
public class AuctionException exends Exception(){
public AuctionException(){}
public AuctionException(String msg){super(msg)}
自定义异常类实例:
- /*自定义异常*/
- class ChushulingException extends Exception
- {
- public ChushulingException(String msg)
- {
- super(msg);
- }
- }
- class ChushufuException extends Exception
- {
- public ChushufuException(String msg)
- {
- super(msg);
- }
- }
- /*自定义异常 End*/
- class Numbertest
- {
- public int shang(int x,int y) throws ChushulingException,ChushufuException
- {
- if(y<0)
- {
- throw new ChushufuException("您输入的是"+y+",规定除数不能为负数!");//抛出异常
- }
- if(y==0)
- {
- throw new ChushulingException("您输入的是"+y+",除数不能为0!");
- }
- int m=x/y;
- return m;
- }
- }
- class Rt001
- {
- public static void main(String[]args)
- {
- Numbertest n=new Numbertest();
- //捕获异常
- try
- {
- System.out.println("商="+n.shang(1,-3));
- }
- catch(ChushulingException yc)
- {
- System.out.println(yc.getMessage());
- yc.printStackTrace();
- }
- catch(ChushufuException yx)
- {
- System.out.println(yx.getMessage());
- yx.printStackTrace();
- }
- catch(Exception y)
- {
- System.out.println(y.getMessage());
- y.printStackTrace();
- }
- finally{ System.out.println("finally!");} finally不管发没发生异常都会被执行
- }
- }
2.5异常转译
如图
当业务逻辑层访问持久层出现SQLException异常时,程序不应该把底层的异常传到用户界面,通常是程序先捕获异常,然后抛出一个新的业务异常,业务异常包含对用户的提示信息。
如下: