异常的概述
异常就是程序中出现的不正常的现象(错误与异常)
在Java中使用Exception类来描述异常
Throwable是Java 语言中所有错误或异常的超类,即祖宗类
Exception有继承关系,它的父类是Throwable
异常继承体系:
Throwable: 它是所有错误与异常的超类(祖宗类)
|- Error 错误
|- Exception 编译期异常,进行编译JAVA程序时出现的问题
|- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题
异常与错误的区别:
异常:指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行
错误:指程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。我们无法针对处理,只能修正代码
异常处理的两种方式:
出现问题,自己解决 try…catch…finally
try{
可能出现异常的代码
} catch(异常类名 对象名){
通常我们只使用一个方法:printStackTrace打印异常信息
} finally {
异常操作中一定要执行的代码
}
出现问题,别人解决 throws
格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2,...{}
public void method() throws Exception{}
异常分类
异常的根类是Throwable,其下有两个子类:Error与Exception,平常所说的异常指Exception。
严重错误Error,无法通过处理的错误
编译时异常Exception,编译时无法编译通过。如日期格式化异常
运行时异常RuntimeException,是Exception的子类,运行时可能会报错,可以不处理。如空指针异常
自定义异常:
如果Java没有提供你需要的异常,则可以自定义异常类
定义方法:编译时异常继承Exception,运行时异常继承RuntimeException
格式:
Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
例:
//自定义异常类
class NoAgeException extends Exception{
NoAgeException() {
super();
}
NoAgeException(String message) {
super(message);
}
}
//Person类
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");
}
}