学习笔记——《异常、异常处理、自定义异常类》

  1. 异常
    大致可以分为两类。运行时异常用户自定义异常
    第一种是编译器不能检测出来的异常比如 数组下表越界访问、除0操作等
    一般可见到的有:
    ArithmeticException、NullPointerException、ClassCastException、 NegativeArraySizeException、ArrayIndexOutOfBoundsException、StringIndexOutOfException
    另一种是为了满足用户的需求自定义的“错误”。
    比如 某Student类限定学生的年龄区间是[15,20],当调用成员方法setAge进行年龄设置,如果不符合要求(检测到输入错误),则抛出自定义异常。

  2. 异常处理
    使用try-catch语句

try {
    
    
    int rst = 1/0;
	System.out.println(rst);
} catch (ArithmeticException e) {
    
    
	System.out.println("int类型下除法的分母不能为0!");
}

规则和建议:
1、一个catch语句只能捕获一种异常,如果try 代码块中可能出现多种异常,则需要多个catch语句
2、为了避免因为异常导致程序的意外终止,最后一个catch 语句参数使用 Exception e。Exception异常类时所有异常类的父类。

  1. 自定义异常类
    定义:创建一个父类是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());
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43341057/article/details/105294702