Java程序的异常
什么是异常
- 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
- 异常发生时,是任程序自生自灭,立刻退出终止。
- 在Java中即,Java在编译或运行或者运行过程中出现的错误。
异常处理机制
- 异常处理机制通过5个关键字实现:try、catch、throw、throws 和 finally。
- try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。
这里是引用
异常处理的建议
- 当你在写try-catch语句的时候,脑子里是知道自己要去针对哪种异常进行处理的,不要只是以防万一,加了个catch(Exception e),这是毫无意义的。并且,一个try块中可能有多个异常,对于每一类异常,要分别写一个catch进行捕获。
- 针对可能出现异常的语句进行try-catch,大段代码的try-catch会非常不利于维护代码时定位异常可能发生的位置,对于肯定不会发生异常的稳定的代码,不需要放在try块中。
- try-catch虽然在功能上,可以成为流程控制的工具,达到条件分支的效果。但相比于if-else语句,java的异常处理机制基于面向对象的思想,使用过程中需要更多的时间与空间的开销,所以不要用异常机制去做基本的条件判断,只有在程序会因为异常而中断时进行捕获和处理。
- finally块中永远不要写return语句,因为finally块中总是最后执行,他会改变预期在try和catch块中的返回值(举个例子,你在catch中捕获了一个异常并抛出e,又在finally语句中return true,这样你抛出的异常就"消失"了,因为当前函数的执行结果已经从抛出异常 转变成 return true)。另外,在使用资源对象与流对象时,finally块必须对资源对象、流对象进行关闭。
throw 与 throws
- throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。throws 可以理解成是一种通知行为,没有实际的抛出异常的动作,而仅仅是告诉调用他的上层函数,这里可能会抛出这个异常;
- throw用于在函数体内语句中,表示抛出一个实际的异常的实际动作,如果在函数内没有捕获并处理,那么将会一直向上抛出这个异常直到被main()/Thread.run()抛出。
- 当一个函数throws声明函数可能抛出一个非运行时异常(检查异常)时,那么即使这个函数内部不显示使用throw,调用它的上层函数也必须包含处理这个异常的代码。
原文来自:博客园(zju_jzb)
原文链接:https://www.cnblogs.com/jzb-blog/p/6693434.html
异常处理示例
这里是引用
package com.exception2;
/**
题目: 老师正在给学生上课, 突然某个学生说网络断了, 老师你来帮助处理一下
没办法,我只能去找网管
*/
//网管类
public class TestException3
{
public static void main(String[] args) throws MyException {
//实列化一个老师
Teacher t = new Teacher("胡杨");
//实列化学生
Student s = new Student("候文桌");
//老师 在 教学生上课
//网管说我来处理
t.teach(s);
}
}
class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
//老师正在给学生上课
public void teach(Student s) throws MyException {
//老师正在给学生上课 是一个持续的状态
int i = 0;
while (true) {
System.out.println(this.name + " 给 " + s.getName() + " 上课 ");
i++;
try {
Thread.sleep(1000);
if (i == 5) {
//突然某个学生说网络断了
//抛出一个异常
//老师你来帮助处理一下
throw new MyException("突然" + s.getName() + "说网络断了");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class MyException extends Exception {
private String message;
public MyException(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
原文链接:http://www.verejava.com/?id=16992994231782