异常分类
大致可以分为两类。运行时异常和受检异常。
第一种异常是编译器不能检测出来的异常比如 数组下表越界访问、除0操作等
一般可见到的有:
ArithmeticException、NullPointerException、ClassCastException、 NegativeArraySizeException、ArrayIndexOutOfBoundsException、StringIndexOutOfException
他们的共同父类是 RuntimeException
另一种是受检异常。需要用户去显式处理这些异常,如果没有处理则编译不通过。比如 IOException
、SQLException
异常处理
使用try-catch语句
try {
int rst = 1/0;
System.out.println(rst);
} catch (ArithmeticException e) {
System.out.println("int类型下除法的分母不能为0!");
}
规则和建议:
- 一个catch语句只能捕获一种异常,如果try 代码块中可能出现多种异常,则需要多个catch语句
- 为了避免因为异常导致程序的意外终止,最后一个catch 语句参数使用 Exception e。Exception异常类时所有异常类的父类。
- 自定义异常类
定义:创建一个父类是Exception类的 异常子类,添加构造方法。
比如定义一个 非法姓名异常类:
class IllegalNameException extends Exception
{
public IllegalNameException() {
super("姓名出错!");
}
public IllegalNameException(String s) {
super(s);
// 这里的s 是用户检测到错误后,抛出异常时候给出的信息
// 即 throw new IllegalNameException(s);
}
}
此异常类与方法的结合使用:
void setName(String s) throws IllegalNameException
{
if (s.length()<1 || s.length()>5) {
throw new IllegalNameException();
}
this.name = s;
}
注意:方法声明时要 同时声明异常
try {
student.setName("Adam"); // student是一个Student类的实例
} catch (IllegalNameException e) {
System.out.println(e.getMessage()); // 通过getMessage方法的调用,得到自定义的错误信息
}
思考:
1、异常的引入,增加了程序的健壮性、“容错性”。对于程序员来说,对处理复杂的情况更有把握。
2、结合C++中的异常捕获机制,对比java中的异常捕获机制,想到的难点:try-catch的嵌套问题等等。
例:定义一个三角形类,包含一个构造方法和一个求面积的方法,求面积的方法对不能构成三角形的数据将抛出自定义的无效三角形异常。
class IllegalTriangleFormException extends Exception
{
public IllegalTriangleFormException() {
super("三边不能构成三角形");
}
public IllegalTriangleFormException(String s) {
super(s);
}
}
class Triangle
{
double a,b,c;
public Triangle(double d1,double d2,double d3) {
a=d1;
b=d2;
c=d3;
}
public double caluArea() throws IllegalTriangleFormException
{
if(a+b>c && a+c>b && c+b>a)
{
double p = (a+b+c)/2; // 半周长
double S = Math.sqrt(p*(p-a)*(p-b)*(p-c)); // 海伦公式
return S;
}else
{
throw new IllegalTriangleFormException();
}
}
}
public class ExpDemo04 {
public static void main(String[] args) {
Triangle triangle = new Triangle(3, 2, 5);
try {
System.out.println(triangle.caluArea());
} catch (IllegalTriangleFormException e) {
System.out.println(e.getMessage());
}
}
}