异常
1.error:没有办法解决,只能修改代码,这个是系统相关的关系
2.Exception:
编译时异常(除了RuntimeException):编译器检查出来异常
运行时异常RuntimeException:出现这个异常的根本原因就是代码不够严谨,就要考虑错误数据
处理异常
1.try…catch…finally
2.throws
如何处理异常:如果该功能内部可以讲问题处理,用try,如果处理不了,就交由调用者处理,就用throws
区别:程序要继续运行就用try,程序不需要继续运行就用throws
在功能方法内部出现某种情况,程序不能继续运行,就用throw把异常抛出
throw 抛
throws声明:写在方法上,格式:方法名throws异常类
定义功能方法时,需要把问题暴露出来,让调用者去处理,那么就通过throws在方法上标识
自定义异常
Exception类和其子类都是系统内置的异常,所有我们去定义一个异常类,就是写一个类去继承Exception和他的子类,
public class ExceptionDemo {
public static void main(String[] args) {
Teacher t = new Teacher("one");
try {
t.lecture();
} catch (NoclassException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("换一台电脑");
}
}
}
class Teacher {
private String name;
private NoteBook book;
public Teacher() {
}
public Teacher(String name) {
this.name = name;
book = new NoteBook();
}
public void lecture() throws NoclassException {
try {
book.run();
} catch (BlueScreenException e) {
// TODO Auto-generated catch block
e.printStackTrace();
book.restart();
} catch (SmokeException e) {
homeWork();// 临时解决方案
throw new NoclassException("课程停止");// 异常转换
}
System.out.println(name + "讲课");
}
public void homeWork(){
System.out.println("大家不要悲伤,我们还有作业,可以写作业");
}
}
class NoteBook {
// 笔记本电脑状态,为0正常,为1就表示蓝屏,为2就表示冒烟
private int state = 2;
public void run() throws BlueScreenException, SmokeException {
System.out.println("笔记本电脑运行");
if (state == 1) {
throw new BlueScreenException("电脑蓝屏");
}
if (state == 2) {
throw new SmokeException("电脑冒烟");
}
}
public void restart() {
state = 0;
System.out.println("笔记本电脑重启");
}
}
class BlueScreenException extends Exception {
public BlueScreenException() {
}
public BlueScreenException(String message) {
super(message);
}
}
class SmokeException extends Exception {
public SmokeException() {
}
public SmokeException(String message) {
super(message);
}
}
class NoclassException extends Exception {
public NoclassException() {
}
public NoclassException(String message) {
super(message);
}
}
finally
finally:finally里面的代码无论异常是否发生,都会执行。有一些特定的代码无论异常是否发生,都需要执行,因为异常会引起程序转跳,导致有些语句执行不到,这样我们就可以把执行的代码放到finally当中。我们一般在finally里面写释放资源的代码,如果有return,那么先执行finally再执行return,除非推出jvm
public static void main(String[] args) {
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// return;
// System.exit(0);// 退出jvm
} finally {
System.out.println("test");
System.out.println("finally");
}
}
}
class TestException extends Exception {
public TestException() {
}
public TestException(String message) {
super(message);
}
}