Java提供了异常处理机制来帮助程序员检查可能出现的错误,保证了程序的可读性和可维护性。下面将介绍Java中的常见异常和自定义异常。
Java中的常见异常
异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。下面来看个例子:
public class Test {
public static void main(String[] args) { //主函数
String str="Z.y"; //定义一个字符串变量
System.out.print(str+"年龄是:"); //输出字符串变量
int age=Integer.parseInt("22L"); //数值型字符串转换成整型
/*Integer类的parseInt()方法可以将字符串转换为整型,但是若字符串不是数值型
* 则会报错!!
*/
System.out.println(age); //输出age
}
}
由于22L并非数值型的字符串,所以系统会抛出错误,跑出了如下的错误:
Z.y年龄是:Exception in thread "main" java.lang.NumberFormatException: For input string: "22L"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Test.main(Test.java:6)
NumberFormatException就是我们经常会遇见的异常之一,Z.y年龄是已经输出,可知第一个输出之前都正确。第一个输出到第二个输出之间发生了错误。因此第二次输出中的age并没有输出。对与这类错误,我们可以进行捕捉异常,异常的捕捉通常以try…catch…finally….语句块构成。其中try…语句块是可能发生异常的Java语句;catch…语句块在try语句块之后,作用是激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行语句块finally。对上面的异常进行捕获:
public class Test { //定义Test类
public static void main(String[] args) { //主函数
try{ //可能发生异常的代码块
String str="Z.y"; //定义字符串变量
System.out.print(str+"年龄是:"); //输出字符串
int age=Integer.parseInt("22L"); //数值型字符串转换成整型
/*Integer类的parseInt()方法可以将字符串转换为整型,但是若字符串不是数值型
* 则会报错!!
*/
System.out.println(age); //输出整型变量
}catch(Exception e){ //激发异常
e.printStackTrace(); //异常性质
}
System.out.println("Program Over");
}
}
运行结果如下所示:
Z.y年龄是:java.lang.NumberFormatException: For input string: "22L"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Test.main(Test.java:7)
Program Over
从输出结果来看,虽然在输出Program Over之前已经出现了异常,但是并不影响Program Over的输出,没有因为异常而终止程序。当try语句块里语句发生异常,就会转到catch语句;执行完catch后,将继续执行catch后的代码,这就是捕获异常的好处。完整的异常处理语句一定要包含finally语句,无论程序中是否会有异常发生, 亦或者代码块try-catch有无顺利执行完毕,都会执行finally语句块。除了以下四种情况:
(1)finally语句块发生异常;
(2)前面代码使用了System.exit()退出程序;
(3)程序所在的线程死亡;
(4)关闭CPU;
Java中一些常见的异常,比如ArithmeticException、NumberFormatException等等,具体的可以参照Java常见异常,最详细的资料需要参考JDK的API文档,具体的不在此赘述。
自定义异常类
下面我们来谈一谈Java中自定义异常的使用。使用Java内置的异常类可以描述在编程时的大部分异常情况。我们还可以继承异常类来定义自己的异常类。自定义异常类的步骤一般是:
(1)创建自己的异常类;
(2)在方法中通过throw关键字抛出异常对象;
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理。否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常;
(4)再出现异常的地方捕获并处理异常;
看一下具体的代码实现:
一、首先我们定义自己的异常类
public class MyException extends Exception { //创建自定义异常,继承Exception类
/**
* 自定义异常类
*/
private static final long serialVersionUID = 6881659454297603792L;
public MyException(String ErrorMessage){ //构造方法
super(ErrorMessage); //父类构造方法
}
}
二、字符串ErrorMessage是要输出的错误信息。下面抛出自定义的异常:
public class Tran { //创建类
static float 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)/2; //返回两数的平均值
}
public static void main(String[] args) { //主方法
try{ //try代码块处理可能出现的异常
float result=avg(45, 120); //调用方法
System.out.println(result); //输出结果
}catch(MyException e){
System.out.println(e); //输出异常信息
}
}
}
运行结果如下:
MyException: 数值太大了
下面再看一个完整的例子:
package Exception2; //定义Exception2包
public class MyException extends Exception{ //自定义异常类,继承Exception
/**
* 自定义异常类
*/
private static final long serialVersionUID = 1998797862547839622L;
String message; //定义字符串
public MyException(String ErrorMessage){ //构造函数
message=ErrorMessage; //将错误的信息赋值给message
}
public String getMessage(){ //重写getMessage方法
return message; //返回错误的信息
}
}
package Exception2; //定义Exception2包
public class Captor { //Captor类
static float quotient(int x,int y)throws MyException{ //quotient方法抛出异常
if(y<0){ //异常情况
throw new MyException("除数不能是负数"); //错误信息
}
return x/y; //返回x/y
}
public static void main(String[] args) { //主函数
try{ //可能出现异常的代码块
float result=quotient(4, -1);
System.out.println(result);
}catch (MyException e){ //发生自定义异常
System.out.println(e.getMessage()); //错误信息
}catch (ArithmeticException e){ //发生算术异常
System.out.println("除数不能为零"); //错误信息
}catch (Exception e){ //其他异常
System.out.println("程序发生了其他异常"); //错误信息
}
}
}
运行结果如下:
除数不能是负数