继承Excetion是定义编译时异常
继承RunntimeExcetion是定义运行时异常
throw:主动抛出异常
throws:方法声明抛出异常,多个异常用、号隔开
自定义异常: 如果想让异常对象在调用printStackTrace方法时,可以有描述信息,就需要加入一个带描述信息的构造方法。示例如下:
/*
* 自定义运行时异常(编译时异常继承Exception)
*/
public class Over50Exception extends RuntimeException {
public Over50Exception() {
super();
// TODO Auto-generated constructor stub
}
//如果想让异常对象在调用printStackTrace方法时,可以有描述信息,就需要加入一个带描述信息的构造方法
public Over50Exception(String message) {
super(message);
}
}
/*
* 自定义异常:定义出来符合自己需求但是Java却没有提供的异常
*
* 区分异常在于异常的类名以及异常的描述
*
* throw:抛出异常
* 自定义异常定义格式:
* 继承Excetion是定义编译时异常 继承RunntimeExcetion是定义运行时异常
*
* 异常的基本操作:
* 1:创建异常对象 普通的创建对象
* 2:抛出异常对象 使用throw,第二结束表示产生了一个异常
* 3:处理异常
* 三个步骤均需要自己手动完成
*/
public class Demo07Exception {
public static void main(String[] args) {
int age = 18;
if(age<50) {
try {
//创建自定义异常对象
Over50Exception o50E = new Over50Exception("养老保险必须是50岁以上的人关注的内容");
//手动抛出异常
throw o50E;
} catch (Over50Exception e) {
//这里打印异常信息就会有自己写的描述信息。
e.printStackTrace();
System.out.println("异常处理代码:小朋友,你还小,再等两年!至少等个20年!");
}
}
System.out.println("aaaa");
//我们也可以自己手动创建异常对象并抛出
RuntimeException re = new RuntimeException("我是很无聊的一个异常,我就试试~");
try {
throw re;
} catch (Exception e) {
//由于RuntimeException是Exception的子类所以这里也会打印出来描述信息。
e.printStackTrace();
System.out.println("我处理了你这个无聊的异常!");
}
System.out.println("bbbb");
}
}
异常的注意事项:
重点要注意的是:函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。如果在finally中再次return A则最终的返回值就是修改后的A值了。下面为示例:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* 异常注意事项:
* 父类方法没有抛出异常,子类重写父类方法时也不可以抛出异常,但是如果子类又在代码中产生了这个异常,则必须捕获不能声明抛出。
*
* 函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。
* finally是一定会被执行的代码块。与try/catch配合使用
*/
public class Demo08Exception {
public static void main(String[] args) {
Zi zi = new Zi();
// zi.method();
int finallyReturn = zi.method2();
System.out.println(finallyReturn);
}
}
abstract class Fu{
public abstract void method();
}
class Zi extends Fu {
//父类方法没有抛出异常,子类重写父类方法时也不可以抛出异常,但是如果子类又在代码中产生了这个异常,则必须捕获不能声明抛出。
@Override
public void method() {
//产生异常的准备
String s = "1949-10-01";
DateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
} finally {
System.out.println("我一定会被执行~");
}
}
public int method2() {
//定义返回值
int i = 100;
//产生异常的准备
String s = "1949-10-01";
DateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sf.parse(s);
//返回路径:每次碰到return就会在返回路径中临时存储这个被返回的值,无论方法内有任何的改变,返回路径中的这个值一致不变。
return i;
} catch (ParseException e) {
e.printStackTrace();
} finally {
i = 200;
System.out.println("我一定会被执行~"+i);
}
System.out.println("异常过后执行其他代码");
return i;
}
}