finally关键字
finally{……}在finally语句块中的代码无论如何都会运行
try,catch后还可以再跟一个finally块。finally块中的代码语句无论如何(无论有没有异常)都会执行(finally块多写一些释放资源,关闭连接的代码)。finally块中的代码在和try块中的代码的冲突时,finally块中的代码一定会执行且会忽略try块中的代码。但是System.exit(0);(虚拟机退出语句)后则不执行fianlly中的代码。
try{..}catch(..){..}
try{..}catch(..){..}finally{..}
try{..}finally{..}
以上三种写法都可以。
程序中抛出异常就要处理,无论是使用throws,还是用捕获是用try,catch,不对异常进行处理,编译不通过。
如何知道在编写的程序中会出现例外呢
1.调用方法,查看API中查看方法中是否有已检查错误。
2.在编译的过程中看提示信息,然后加上相应的处理。
Throwable有一个message属性。在使用catch的时候可以调用:
try{……}Catch(IOException e){System.out.println(e.message());}//异常的信息的显示
try{……}Catch(IOException e){e. printStackTrace();}//异常堆栈信息的显示
printStackTrace()方法是打印异常堆栈信息,是常用的异常处理的访法,它是异常的方法。
以上两条语句都可打印出错的信息。告诉我们出错类型及代码的运行过程,在调试的中非常有用。
例:
public class TestHundredException{
public static void main(String[] args){
MyClass mc=new MyClass();
try{//在这个try语句块中抛出的异常会得到处理
System.out.println(mc.add(10,80));
}
catch(HundredException e){
//捕获try块中抛出的异常
e.printStackTrace();
}
try{
System.out.println(mc.add(30,70));
}
catch(HundredException e){
e.printStackTrace();
}finally{
System.exit(0);
}
}
}
class HundredException extends Exception{//自定义异常
public HundredException(String message){
super(message);
}
}
class MyClass{
public int add(int a,int b) throws HundredException{
int c=a+b;
if (c==100) {
throw new HundredException("a+b can\'t be 100");
else{
return c;
}
}
}
自定义异常
自定义异常要是Exception的子类,以下是一个例子:
自己定义异常类必须是Excepiton或者RuntimeException的子类。
public class TestMyException{
public static void main(String[] args){
int n=Integer.parseInt(args[0]);
A a=new A();
try{
a.calculate(n);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("OK");
}
}
class A{
public void calculate(int n) throws ZhiShuException{
for(int i=2;i<n;i++){
if (n % i == 0) return;
}
throw new ZhiShuException(n+" is a Prime Number");
}
}
class ZhiShuException extends Exception{//自定义的异常,是Exception的子类
public ZhiShuException(String message){
//注意在构造父类对象时需要String类型的message作为参数
super(message);
}
}
开发中的两个道理:
① 如何控制try块的范围:根据操作的连动性和相关性,前面的程序代码块抛出的异常影响了后面程序代码的运行,这两个段程序代码就存在关联,应该放在同一个try块中。
② 对已经查出来的例外,有throw(消极)和try {…}catch(…){…}(积极)两种处理方法。对于throws把异常抛到try catch能够恰当地处理异常的位置(即放在具备对这个异常进行处理的能力的位置)。没有处理异常的能力就将异常继续上抛。
throw是一个语句,用来做抛出例外的功能。
throws是表示本方法中会异常抛出,本方法不做处理,将异常对象向上抛出。
throws写的是异常类型,throw后写的是要抛出的异常对象。
注意:方法的覆盖中,如果子类的方法抛出的例外是父类方法抛出的例外的父类型,那么编译就会出错:子类无法覆盖父类。
结论:子类方法不可比父类方法抛出更多的例外。子类抛出的例外或者与父类抛出的例外一致,或者是父类抛出例外的子类型。或者子类型不抛出例外。如果父类型无throws时,子类型也不允许出现throws。此时只能使用try catch。
断言是一种调试工具(assert)
其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,在屏幕上出现assert信息。
Assert只是用于调试。在产品编译完成后上线assert代码就被删除了。