添加异常是为了提高代码的健壮性
自定义异常
class NoAgeException extends RuntimeException
{
/*
为什么要定义构造函数,看到Java中的异常描述类中有提供对问题对象的初始化方法。
*/
NoAgeException()
{
super();
}
NoAgeException(String message)
{
super(message);
}
}
class Person{
private String name;
private int age;
Person(String name,int age) {
//加入逻辑判断。
if(age<0 || age>200){
throw new NoAgeException(age+",年龄数值非法");
}
this.name = name;
this.age = age;
}
//定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString(){
return "Person[name="+name+",age="+age+"]";
}
}
class ExceptionDemo{
public static void main(String[] args) {
Person p = new Person("xiaoming",-20);
System.out.println(p);
}
}
异常的分类
Exception异常
在函数内抛出Exception,编译失败,因为编译器再检查语法时发生了错误,该程序已经出现问题,Java认为这个程序本身出现了问题,需要捕获或者声明出来(你要么把问题处理,要么把问题标识出来让调用知道)。
RuntimeException异常
为什么抛出RuntimeException,不需要捕获,不要声明呢?不是功能本身发生的异常,而是因为比如调用者传递参数错误而导致功能运行失败。这也是问题,需要通过异常来体现,但是这个异常不要声明出来的。
声明和捕获
声明:将问题表示出来,报告给调用者,如果函数内通过throw抛出了异常,而没有捕获,那么必须通过throws进行声明,让调用者去处理
捕获:Java中对异常有专门的语句进行捕获
try
{
//需要被检测的语句。
}
catch(异常类 变量)//参数。
{
//异常的处理语句。
}
finally
{
//一定会被执行的语句。
}
声明和捕获的应用
class NoAgeException extends RuntimeException{
NoAgeException() {
super();
}
NoAgeException(String message) {
super(message);
}
}
class Person{
private String name;
private int age;
Person(String name,int age)//throws NoAgeException {
//加入逻辑判断。
if(age<0 || age>200) {
throw new NoAgeException(age+",年龄数值非法");
}
this.name = name;
this.age = age;
}
//定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。
public String toString() {
return "Person[name="+name+",age="+age+"]";
}
}
class ExceptionDemo{
public static void main(String[] args) {
try
{
Person p = new Person("xiaoming",20);
System.out.println(p);
}
catch (NoAgeException ex){
System.out.println("异常啦");
}
System.out.println("over");
}
}
继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。
继承RuntimeExcpetion,不需要throws声明的,这时调用是不可能编写捕获代码的,因为调用根本就不知道有问题。一旦发生NoAgeException,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码。
throw和throws区别
throw和throws的区别:
- throw用在函数内。throws用在函数上。
- thorw抛出的是异常对象。throws用于进行异常类的声明,后面异常类可以有多个,用逗号隔开。