华恩JAVA班第28天
异常笔记:
0、error和exception有什么区别?
Error类和Exception类都继承自Throwable类。
Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行别无选择。
Exception表示需要捕捉或者程序进行处理的异常,一般是因为程序设计的瑕疵而引起的问题或者外在的输入等引起的一般性问题,是程序必须处理的。
1、异常分类
(1)所有的异常都是由Throwable继承而来,但在下一层分解为两个分支:Error和Exception。
(2)Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。
如果出现了这样的内部错误,除了通知给用户,并尽力使程序安全地终止之外,再也无能为力了。
(3)在设计Java程序时,需要关注Exception层次结构。这个层次结构又分为两个分支:
① 一个分支派生于RuntimeException。由程序错误导致的异常属于RuntimeException。
② 另一个分支包含其他异常。程序本身没问题,但由于像I/0错误这类问题导致的异常属于其他异常。
如果出现了RuntimeException异常,那么一定是程序员的问题。
(4)Java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查(unchecked)异常;所有其他的异常称为已检查(checked)异常。
编译器将核查是否为所有的已检查异常提供了异常处理器。
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
2、声明已检查异常
(1)如果遇到无法处理的情况,那么java的方法可以抛出一个异常。
(2)一个方法必须声明所有可能抛出的已检查异常。
(3)对于那些可能被他人使用的java方法,应该根据异常规范(exceptionspecification),在方法的首部声明这个方法可能抛出的异常。
如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类。如下面例子所示:
public Image loadImage(String s) throws EOFException,MalformedURLException
{ ... }'
(4)在java中,没有throws说明符的方法将不能抛出任何已检查异常。
(5)如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的范围。
如果超类方法没有抛出任何已检查异常,子类也不能抛出任何已检查异常。
(6)不应该声明java的内部错误,即从Error继承的错误。
不应该声明从RuntimeException继承的那些未检查异常。
3、抛出异常
(1)对于一个已经存在的异常类,将其抛出非常容易:
① 找到一个合适的异常类。
② 创建这个类的一个对象。
③ 将对象抛出。
(2)一旦方法抛出了异常,这个方法就不可能返回到调用者。
4、创建异常类
只需要定义一个派生于Exception的类,或者派生于Exception子类的类。
习惯上,定义的异常类应该包含两个构造器:一个是默认构造器;另一个是带有详细描述信息的构造器。例如:
class FileFormatException extends IOExcption
{
public FileFormatException(){}
public FileFormatException(String gripe)
{
super(gripe);
}
}
5、捕获异常
(1)如果某个异常发生的时候没有在任何地方进行捕获,那么程序就会终止执行,并在控制台上打印出异常信息。
(2)如果调用了一个抛出已检查异常的方法,就必须对它进行处理,或者将它传递出去。
通过,应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常传递出去。如果想将异常传递出去,就必须在方法的首部添加一个throws说明符。
(3)如果编写一个覆盖超类的方法,而这个方法又没有抛出异常,那么这个方法就必须捕获方法代码中出现的每一个已检查异常。
不允许在子类的throws说明符中出现超过超类的方法所列出的异常类范围。
6、再次抛出异常与异常链
7、finally子句
当try{}里有一个return语句的时候,finally{}中的代码也会在return之前执行。
上课例子:
一:
package com.zgz;
import java.util.InputMismatchException;
import java.util.Scanner;
*文件名称:Test.java
*功能说明:
*开发人员:Ziu Ginzeon
*创建时间:2013年7月25日 下午2:26:25
public class Test {
public static void main(String[] args){
// TODO Auto-generated methodstub
try{
System.out.println("请输入课程代号1.语文2.数学 3.英语");
Scanner in =new Scanner(System.in);
int a =in.nextInt();
if(a ==1){
System.out.println("语文");
}else if(a ==2){
System.out.println("数学");
}else if(a ==3){
System.out.println("英语");
}else{
thrownew Exception();
}
}catch(InputMismatchExceptione){
System.out.println("输入错误,必须是整数");
e.printStackTrace();
}catch(Exception e){
System.out.println("输入错误,必须是1,2或3");
e.printStackTrace();
}finally{
System.out.println("欢迎提出建议");
}
}
}
二:
package com.zjj;
*文件名称:PessonException.java
*功能说明:
*开发人员:Ziu Ginzeon
*创建时间:2013年7月25日 下午3:03:21
public class Pesson {
private String name ="tom";
private int age;
private String sex;
public void setAge(int age)throwsException{
if(age>100||age<=0)
throw newException("年龄必须大于0并且小于等于100");
else{
this.age =age;
}
}
public void setSex(String sex)throwsException{
if("男".equals(sex)||"女".equals(sex))
this.sex =sex;
else{
throw newException("性别必须是“男”或者是“女”");
}
}
public void print(){
System.out.println(this.name+"("+this.sex+","+this.age+"岁)");
}
}
package com.zjj;
import java.util.Scanner;
*文件名称:PessonExceptionTest.java
*功能说明:
*开发人员:Ziu Ginzeon
*创建时间:2013年7月25日 下午3:10:10
public class PessonExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated methodstub
Pesson pesson = newPesson();
Scanner in = newScanner(System.in);
try {
System.out.println("请输入年龄");
int b =in.nextInt();
pesson.setAge(b);
System.out.println("请输入性别");
String a =in.next();
pesson.setSex(a);
} catch (Exception e) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
System.out.println("欢迎使用");
}
pesson.print();
}
}