一、在方法中抛出异常
若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常
1、使用throws关键字抛出异常
throws关键字通常被应用在声明方法中,用来指定方法可能抛出的异常。多个异常可使用逗号分割。示例如下:
public class Shoot {
static void pop() throws NegativeArraySizeException{
//定义方法并抛出异常
int[] arr = new int[-3]; //创建数组
}
public static void main(String[] args) {
try {
pop();
}catch (NegativeArraySizeException e) {
// TODO: handle exception
System.out.println("pop()方法抛出的异常");
}
}
}
/*输出结果如下:
pop()方法抛出的异常
*/
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
2、使用throw关键字抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throw关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块,通过下面的示例来说明throw的使用:
public class MyException extends Exception { //创建自定义异常,继承Exception
String message; //定义String类型变量
public MyException(String ErrorMessage) { //构造方法
message = ErrorMessage; //父类构造方法
}
public String getMessage() {
return message;
}
}
public class Captor {
static int quotient(int x,int y) throws MyException{
if(y<0) {
throw new MyException("除数不能为负数!");
}
return x/y;
}
public static void main(String args[]) {
try {
int result = quotient(3,-1);
}catch(MyException e) {
System.out.println(e.getMessage());
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception e) {
System.out.println("程序发生了其它异常");
}
}
}
/*输出结果如下:
除数不能为负数!
*/
二、运行时异常
RuntimeException异常时程序运行过程中产生的异常。Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。
Java中提供了常见的RuntimeException异常,这些异常可以通过try-catch语句捕获,如下表所示:
种类 | 说明 |
---|---|
NullPointerException | 空指针异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
ArithmeticException | 算术异常 |
ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
IllegalArgumentException | 非法参数异常 |
SecurityException | 安全性异常 |
NegativeArraySizeException | 数组长度为负异常 |
三、异常的使用原则
Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
1、在当前方法声明中使用try-catch语句捕获异常
2、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常