1. 异常
小王每天开车去上班,一般情况下半个小时内就能到,一旦发生堵车或者其他不可预知的事情,小王都会与公司取得联系然后告知情况,以免影响工作。而对于程序而言,堵车就是一种异常,与公司联系告知情况,就是一种异常处理。
异常也称为例外,是在程序运行时候发生的,会打断程序的正常执行过程。
异常关系继承图
从编程的角度,我们把异常分为两类。
1.1 非受检异常(运行)
编译器不要求强制处理的异常,一般指的是逻辑错误,是程序员应该积极避免出现的异常,如类型转换异常(lang.ClassCastException)、数组越界异常(ArrayIndexOutOfBoundsException)、空指针异常(lang.NullPointerException)等。
1.2 受检异常(可控)
指编译器要求必须处置的异常,即程序在运行时由于外界因素造成的一般性异常,如文件失踪异常(lang.ClassNotFoundException)、操作文件异常(io.IOException)、数据库异常(sql.SQLException)等。
2. 日期工具类
java.util.Date表示指定的时间信息,可以精确到毫秒,Date中许多方法已经过时但仍能使用;
java.text.DateFormat是一个格式化日期的工具类,它的format和parse方法可以对日期和字符串进行转换,但是它的构造器只有DateFormat(),无法直接指定模版 ,所以我们使用它的子类SimpleDateFomat来实例化,用父类DateFormat来接收。
2.1 格式化
日期的格式化就是把date按照指定模版转成String的过程。
// 格式化过程:需要一个模版 年-月-日
// public StringBuffer format(Date date)
Date date = new Date();
DateFormat f = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
String dateStr = f.format(date);
System.out.println(dateStr);
2.2 解析
日期的解析就是把String按照指定模版转成date的过程。
// 解析过程
// 需要一个模版 :这个模版的格式必须和你的要解析的字符串格式一样
// 抛出一个类型不匹配的异常
String myDate = "2008-08-08";
// public Date parse(String text)
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date date2 = f.parse(myDate);
System.out.println(date2);
3. 异常处理
3.1 异常处理try - catch - finally
try {
int a = 10;
int b = 0;
System.out.println(a/b);// 可能发生异常的代码段
} catch (ArithmeticException e) {// 发生异常之后我们的处理方案
System.exit(-1);// 退出虚拟机
} finally{
// 无论如何都会执行的代码段
}
tips:try只能有一个,catch可以有n个(n>=0),finally要么有一个要么没有。
finally中的return关键字
try {
System.out.println(1/0);
} catch(Exception e){
System.out.println("不能为0");
return;// 结束方法
} finally{
System.out.println("123");// 无论是否发生异常,都一定会执行的最终代码
}
tips:如果catch块中存在return,则先执行finally中的代码,然后结束方法。
3.2 throw new抛出
我们可以通过throw new的方式主动的去抛出一个异常。
int a = 10;
int b = 0;
if(b==0){
// 主动抛出一个异常
throw new ArithmeticException("你的除数不能为0");
}else{
System.out.println(a/b);
}
tips:该方式只能抛出一个异常。
3.3 异常处理throws
我们可以直接通过throws关键字直接抛出异常,让该方法的使用者去处理这个异常。
public static void fun1() throws ArithmeticException{
int a = 10;
int b = 0;
// 可能发生异常的代码段
System.out.println(a/b);
}
tips:该方式能抛出多种异常,用逗号隔开,且无抛出的多种异常之间,所谓顺序和大小。
4. 自定义异常
我们可以通过继承Exception的方式来自定义一个异常。
public class MyException extends Exception{
public MyException(){};
public MyException(String str){
super(str);
// 可以在自己的异常类中,进行一些业务处理
System.out.println("我是自己写的异常的构造方法");
}
}
public static void main(String[] args) throws MyException {
throw new MyException("你触发了我自己写的异常");
}
5. 重写中的异常处理
对于抛出异常的方法我们也可以对其进行Override,抛出的异常可以不重写,如果想要重写,只能往更小的范围去重写,而且,如果父类中方法没有抛出任何异常,则子类在重写它的时候也不允许抛出异常。
public class A {
public void fun() throws ArrayIndexOutOfBoundsException{}
}
public class B extends A{
@Override
//这种重写方式是错误的,不能把小范围异常重写为大范围异常
public void fun() throws Exception {}
}