异常类型
异常就是从一个异常类创建的对象,在这种情况下,异常类就是java.lang.ArithmeticException,异常被catch块所捕获,catch块中的代码块以处理异常
一个异常可能是通过try中块中的throw语句直接抛出,或者调用一个可能会抛出异常的方法而抛出异常处理的优点,使方法抛出一个异常给他的调用者,并由调用者处理该异常
抛出异常就是将异常从一个地方专递到另外一个地方
异常捕获结构由try、catch和finaly3部分组成,其中,try语句存放的是可能发生异常的语句,catch程序块放在try语句之后,用来激发被捕获的异常,finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行fianlly语句。
Exceptiontype1 ex 中的标识符ex很像方法中参数,所以这个参数被称为catch块的参数
语句代码如下:
try{
//代码执行块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序块
}
try...catch异常捕获结构
import java.util.Scanner;
public class QuetienWithException {
public static int quotient(int number1,int number2) {
if (number2 == 0)
throw new ArithmeticException("Divisor cannot be zero");
return number1 / number2;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter two integers:");
int number1 = input.nextInt();
int number2 = input.nextInt();
try{
int result = quotient(number1,number2);
System.out.println(number1+" / "+number2+" is "+result);
}
catch(ArithmeticException ex){
System.out.println("Exception:an integer"+"cannot be dicided by zero");
}
System.out.println("Execution continues……");
}
}
ry...catch...finally异常捕获结构
异常处理语法结构中只有try块是必须的,如果没有try,则不能有后面的catch块和finally块;catch块和finally块都是可选的,但catch块和finally块至少出现一个,也可同时出现,可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面;但不能只有try块,既没有catch块,也没有finally块:多个catch块必须位于try块之后,finally块必须位于所有的catch块之后。
package Text;
import java.io.FileInputStream;
import java.io.IOException;
public class FinallyTest{
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
//return 语句强制方法返回
return;
//使用exit退出虚拟机
//System.exit(1);
}
finally
{
//关闭磁盘文件,回收资源
if(fis!= null) {
try{
fis.close();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
System.out.println("执行finally块里的资源回收");
}
}
}
除非在tyr块、catch块中调用了退出虚拟机的方法,否则不管在执行tyr块、catch块中执行怎样的代码,出现任何情况,异常处理的finally块总会被执行
使
用throws声明抛出异常
throws申明抛出只能在方法签名中使用,throws可以抛出多个异常类,多个异常类之间以逗号隔开,throws声明抛出的语法如下:
throws ExceptionClass1,ExceptionClass2……
使用throws声明抛出异常时有一个限制,就是方法重写时“两小”中的一条规则:子类方法声明抛出的异常类型应该是父类声明抛出的异常类型或相同,子类方法声明抛出的异常不允许比父类方法抛出的异常多。
package Text;
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsTest1{
public static void main(String[] args)
throws IOException
{
FileInputStream fis = new FileInputStream("a.txt");
}
}
package Text;
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsText2{
public static void main(String[] args)
throws Exception{
/*
* 因为Test()方法声明抛出IOException异常
* 所以调用该方法的代码要么处于try……catch块中
* 要么处于另一个带throws声明抛出的方法中
*/
}
public static void test() throws IOException{
/*
*因为FileInputStream的构造器声明抛出IOException异常
*所以调用FileInputStream的代码要么处于try……catch块中
*要么处于另一个带throws声明抛出的方法中
*/
FileInputStream fis = new FileInputStream("a.txt");
}
}
throw异常
如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。throw语句的语法格式如下:
throw ExceptionInstance;
自定义异常类
用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类,定义异常类时通常需要提供两个构造器:一个是无参数的构造器,一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法的返回值)。
使用自定义异常步骤
-
创建自定义异常类
-
在方法中通过throw关键字抛出异常对象
-
如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要排除给方法调用者的异常,继续下一步操作
-
在出现异常方法的调用者中捕获并处理异常
异常处理规则
-
不要过度使用异常
-
不要使用过于庞大的try块
-
避免使用Catch All语句
-
不要忽略捕获到的异常