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

异常分类

大致可以分为两类。运行时异常受检异常

第一种异常是编译器不能检测出来的异常比如 数组下表越界访问、除0操作等
一般可见到的有:
ArithmeticException、NullPointerException、ClassCastException、 NegativeArraySizeException、ArrayIndexOutOfBoundsException、StringIndexOutOfException
他们的共同父类RuntimeException

另一种是受检异常。需要用户去显式处理这些异常,如果没有处理则编译不通过。比如 IOExceptionSQLException

异常处理

使用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异常类时所有异常类的父类。
  3. 自定义异常类
    定义:创建一个父类是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());
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值