Java程序设计

第五章 异常处理

认识异常

关于上班这件事

认识异常

  • Java异常会输出一个错误信息,并停止线程的执行
  • 程序员可在程序中定义异常处理程序来捕获和处理异常

认识异常

异常处理的概念

  • 程序运行时出现运行错误,导致程序异常终止
    • 运行时错误通常由异常导致
    • 如果未及时处理异常,程序会非正常终止
    • 可以通过合适的处理方法来保证程序正常进行,即异常处理

Quotient.java

QuotientWithIf.java

QuotientWithException.java

异常处理的概念

  • 定义的方法可以抛出异常,由其调用者方法进行处理
  • 若调用者方法无能力对异常进行处理,则需由该方法本身进行异常处理或终止
  • 系统库方法只能检测异常错误,但无法进行处理,需由调用方法本身进行处理

QuetientWithException.java

FileNotFoundExceptionDemo.java

InputMismatchExceptionDemo.java

异常的类型

异常的类型

异常的类型

异常的类型

异常的类型

异常处理的方法

异常处理的方法

异常处理的方法

声明异常

  • 每个方法都必须声明其可能抛出的必检异常类型
  • 
    public void myMethod() throws IOException{
        // do something
    }
    
    public void myMethod() throws Exception1, Exception2, ..., ExceptionN{
        // do something
    }
                            

抛出异常

  • 当程序检测到一个错误时,程序可创建一个恰当的异常类型的实例抛出

    FileNotFoundExceptionDemo ex=new FileNotFoundExceptionDemo("File Not Exist");
    throw ex;

    throw new FileNotFoundException("File Not Exist");
                        

抛出异常

  • throw
    • 用于明确抛出一个异常,用户必须得到一个Throwable类或其子类的实例句柄,通过参数传到catch子句中,或用new创建一个新的异常实例
  • throws
    • 如果一个方法a可能引发异常,而其本身不对异常进行处理,则a方法必须将此异常抛给调用者以使程序能够继续执行
    • 如果方法中有throws关键字,则必须在调用方法中用try-catch块进行异常捕获。如果不捕获,则需要在调用方法中用throw将异常抛出

ThrowDemo.java

ThrowsDemo.java

捕获异常


try{
    statements;
}
catch(Exception1 ex1){
    handler for ex1;
}
catch(Exception2 ex2){
    handler for ex2;
}
...
catch(ExceptionN exN){
    handler for exN;
}
                            

main method{
    ...
    try{
        ...
        invoke method1;
        statement1;
    }
    catch(Exception1 ex1){
        process ex1;
    }
    statement2;
}
                            

捕获异常

捕获异常

  • Java要求程序员处理必检异常,若方法声明了一个必检异常,则必须在try-catch块中调用,或在调用方法声明中将其抛出

void p2() throws IOException{
    // ...
}

void p1(){
    try{
        p2();
    }
    catch(IOException ex){
        //...
    }
}
                            

void p2() throws IOException{
    //...
}

void p1() throws IOException{
    p2();
}
                            

获取异常信息

TestException.java

异常处理示例


try{
    statements;
}
catch(Exception ex){
    perform operations before exits;
    throw ex;
}
                        

异常处理示例

CircleWithException.java

TestCircleWithException.java

finally子句

  • finally子句,即指无论是否发生异常都会执行的语句
  • 
    try{
        statement;
    }
    catch(Exception ex){
        handling ex;
    }
    finally{
        finalstatements;
    }
                                    
    
    public class FinallyDemo{
        public static void main( String [] args ){
            java.io.PrintWriter output = null;
            try{
                output = new java.io.PrintWriter( "text.txt" );
                output.println( "Welcome to Java" );
            }
            catch( java.io.IOException ex ){
                ex.printStackTrace();
            }
            finally{
                if( output != null )
                output.close();
            } 
            System.out.println( "End of program" ); 
        }
    }
                                    

finally子句

Case 1: 无异常


try{
    statements;
}
catch( Exception ex){
    handling ex;
}
finally{
    finalStatements;
}
Next statements;
                        

finally子句

Case 2: 抛出可捕获的异常


try{
    statements1;
    statements2;
    statements3;
}
catch( Exception1 ex){
    handling ex;
}
finally{
    finalStatements;
}
Next statements;
                        

finally子句

Case 3: 无法处理异常,继续抛出


try{
    statements1;
    statements2;
    statements3;
}
catch( Exception1 ex){
    handling ex;
}
catch( Exception2 ex ){
    handling ex;
    throw ex;
}
finally{
    finalStatements;
}
Next statements;
                        

异常处理关键词

finally之前有return语句怎么办?

异常处理注意事项

  • 可将错误代码处理与正常程序设计任务分离,增加代码的可读性,易于修改
  • 需要更多的时间和资源
  • 何时抛出异常?
    • 出现在方法中的异常,若想让该方法的调用者处理,就需要创建一个异常对象,并将其抛出,如果能在发生异常的方法中处理异常,就不需要抛出异常
    • 当必须处理不可预料的错误状况时,可使用try-catch块
  • 系统提供的异常类有限,大多数问题需要自定义异常类进行处理