使用Java内置的异常类可以描述在编程时出现的大部分异常情况,但是有些情况是通过内置异常类无法识别的。例如

int age = -50;
System.out.println("王师傅今年"+age+"岁了");

上面代码运行时没有任何问题,但是人类的年龄可能是负数么?这类问题编译器是无法识别的,但很明显不符合常理,那么的,对于这类问题即可通过自定义异常对它们进行处理。Java中可以通过继承Exception类自定义异常类。

在程序中使用自定义异常类,大体可分为以下几个步骤。

1,创建自定义异常类。

2,在方法中通过throw关键字抛出异常对象。

3,如果在当前抛出异常的方法中处理异常,可以使用try…catch代码块捕获并处理,否则,在方法的声明处通过throws关键字指明要抛给方法调用者的异常,继续进行下一步操作。

4,在出现异常方法的调用者中捕获并处理异常。

有了自定义异常,再来解决年龄为负数的异常问题。我们先创建一个自定义异常类。

Java自定义异常接口 java中自定义异常_自定义异常


再创建另一个类,该类中创建一个带有int型参数的方法avg(),该方法用来检查年龄是否小于0,如果小于零,则使用throw关键字抛出一个自定义的MyException异常对象,并在main()方法中捕捉该异常。

Java自定义异常接口 java中自定义异常_Java_02


Java自定义异常接口 java中自定义异常_自定义异常_03


运行程序,如果年龄小于0,则显示自定义的异常信息。

自定义异常主要用在以下场合。

1,使异常信息更加具体,比如跟别人合作开发时,程序出现了空指针异常,但别人可能不清楚这个空指针是如何产生的,这是即可自定义一个显示具体信息的异常,比如自定义一个用户信息为空时抛出的异常,当这个异常发生就代表用户填写的信息不完整。

2,程序中有些错误是符合Java语法的,但不符合业务逻辑或实际情况,比如程序中出现了一个人的年龄是负数,人员个数为小数等。

3,在分层的软件架构中,通常在表现层同意对系统其他层次的异常进行捕获处理。

异常的使用原则

Java异常强制用户去考虑程序的强健性和安全性。异常处理不应该用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下原则。
1,不要过度使用异常。虽然通过异常可以增强程序的健壮性,但如果使用过多不必要的异常处理,可能会影响程序的执行效率。
2,不要使用过于庞大的try…catch块,在一个try块中放置大量的代码,这种写法看上去很简单,但是由于try块中的代码过于庞大,业务过于复杂,会造成try块中出现异常的可能性大大增加,从而导致分析异常原因的难度也大大增加。
3,避免使用catch(Exception e)。因为所有异常都采用相同的处理方式,将导致无法对不同异常分情况处理。另外,这种捕获方式可能将程序中的全部错误,异常捕获到,这时如果出现一些关键异常,可能被忽略掉。
4,不要忽略捕捉到的异常,遇到异常一定要及时处理。
5,如果父类抛出多个异常,则覆盖方法必须抛出相同的异常或其异常的子类,不能抛出新异常。