8月2日 Java异常处理机制

异常处理的消极方式,不断给方法抛出异常:

package com.pyc.test;

import java.io.IOException;
import java.sql.SQLException;

public class TestMain {
    public static void main(String [] args)throws SQLException,IOException {
    ma();
    }
    public static void ma()throws SQLException,IOException
    {
        System.out.println("开始ma");
        mb();
        System.out.println("结束ma");
        }
    public static void mb()throws SQLException,IOException{
        System.out.println("开始mb");
        mc();
        System.out.println("结束mb");
        }
    public static void mc()throws SQLException,IOException{
        System.out.println("开始mc");
        md("2");
        System.out.println("结束mc");
        }
    public static void md(String i)throws SQLException,IOException{
        System.out.println("开始md");
        if(i.equals("1")) {
            throw new NullPointerException();
        }else if(i.equals("2")) {
            throw new SQLException();
        }else if(i.equals("3")) {
            throw new IOException();
        }
        //throw new NullPointerException();
        }

}
异常的处理积极方式,使用try catch语句:

package com.pyc.test;

import java.io.IOException;
import java.sql.SQLException;

public class TestMain {
    public static void main(String [] args) {
    ma();
    }
    public static void ma()
    {
        System.out.println("开始ma");
        mb();
        System.out.println("结束ma");
        }
    public static void mb(){
        System.out.println("开始mb");
        mc();
        System.out.println("结束mb");
        }
    public static void mc(){
        System.out.println("开始mc");
        try{
            md("2");                              //这里通过改变数值测试是有错误还是没错误
            //System.err.println("这时抛出的异常");//测试走不走这一步,结果不走
        }catch(SQLException e) {
            e.printStackTrace();//注释掉它之后,不通知用户错没错
            //System.err.println("这时抛出的异常");
        }catch(IOException e) {
            e.printStackTrace();
        }finally {                                //是否产生异常都会运行,是必须运行的,只能和try catch连起来用
            System.err.println("这时抛出的异常");
        }
        System.out.println("结束mc");
        }
    public static void md(String i)throws SQLException,IOException{
        System.out.println("开始md");
        if(i.equals("1")) {
            throw new NullPointerException();
        }else if(i.equals("2")) {
            throw new SQLException();
        }else if(i.equals("3")) {
            throw new IOException();
        }
        //throw new NullPointerException();
        }

}

注:Exception是所有异常类的一个父类,抛异常的时候如果放在最上面,下面的异常catch就失去作用,显示错误,因此父类异常应该放在最下面。

异常类的重写:

class Super {
    public void sup() throws SQLException,IOException{//所有编译异常的父类:RuntimeException
                                                      
    }
}
class Supers extends Super{
    public void sup() throws SQLException{           //子类里重写方法所抛出的异常不能大于父类里抛出的异常,子类中可以不抛
        throw new SQLException();
    }
}
/*class Supers extends Super{
    public void sup() throws IOException{
        //throw new SQLException();
    }
}*/
class MyException extends Exception{
    public MyException(String str) {
        super(str);
    }
}
class MyRuntimeException extends RuntimeException{
    public MyRuntimeException(String str) {
        super(str);                           
    }
    //public MyRuntimeException(String str) {
        //super(str);
    //}
}

异常父类重写的全部代码:

package com.dhy.test;

import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;

public class TestMain {

    public static void main(String[] args) {
        //运行时异常
        //        int s=0;
//        System.out.println(10/s);
        //编译期异常
//        SimpleDateFormat sdf=new SimpleDateFormat("yyyy");
//        sdf.parse("2018");
        ma();
//        Super su=new Supers();
//            su.sup();
        
    }
    public static void ma() {
        System.err.println("开始ma");
        mb();
        System.err.println("结束ma");
    }
    public static void mb() {
        System.err.println("开始mb");
        System.err.println(mc());
        System.err.println("结束mb");
    }
    public static int mc() {
        System.err.println("开始mc");
        try {
            System.err.println(md("5"));
        } catch (Exception e) {
            e.printStackTrace();
        } 
//        catch (SQLException e) {
////            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        finally {
            System.err.println("这是在抛出的异常");
        }
        System.err.println("结束mc");
        return 1;
    }
    public static int md(String i) throws SQLException,IOException,MyException{
        System.err.println("开始md");
        if(i.equals("1")) {
            throw new NullPointerException();
        }else if(i.equals("2")) {
            throw new SQLException();
        }else if(i.equals("3")) {
            throw new IOException();
        }else if(i.equals("4")) {
            throw new MyException("这是一个自己定义的错误");
        }else if(i.equals("5")) {
            throw new MyRuntimeException("这是一个自己定义的运行时错误");
        }
        return 2;
        
    }
    
}
//class Super{
//    public void sup ()throws RuntimeException {
//        
//    }
//}
//class Supers extends Super{
//    public void sup(){
////        throw new SQLException();
//    }
//}
 class MyException extends Exception{
     public MyException(String str) {
         super(str);
     }
 }
 class MyRuntimeException extends RuntimeException{
     public MyRuntimeException(String str) {
         super(str);
     }
     public MyRuntimeException() {
         
     }
     
 }

8月2日作业:

1.(try-catch-finally)有如下代码:

import java.io.*;

import java.sql.*;

class TestException{

public static void main(String args[]){

System.out.println(“main 1”);

int n;

//读入 n

ma(n);

System.out.println(“main2”);

}

public static void ma(int n){

try{

System.out.println(“ma1”);

mb(n);

System.out.println(“ma2”);

}catch(EOFException e){

System.out.println(“Catch EOFException”);

}catch(IOException e){

System.out.println(“Catch IOException”);

}catch(SQLException e){

System.out.println(“Catch SQLException”);

}catch(Exception e){

System.out.println(“Catch Exception”);

}finally{

System.out.println(“In finally”);

}

}

public static void mb(int n) throws Exception{

System.out.println(“mb1”);

if (n == 1) throw new EOFException();

if (n == 2) throw new FileNotFoundException();

if (n == 3) throw new SQLException();

if (n == 4) throw new NullPointerException();

System.out.println(“mb2”);

}

}

问:当读入的 n 分别为 1,2,3,4,5 时,输出的结果分别是什么?

2.)创建两个自定义异常类 MyException1 和 MyException2。

要求:

1) MyException1 为已检查异常,MyException2 为未检查异常

2) 这两个异常均具有两个构造函数,一个无参,另一个带字符串参数,参数表示产生

异常的详细信息。

3.(try-catch)代码改错。

class MyException{}

class TestException{

public static void main(String args[]){

ma();

}

public static int ma(){

try{

m();

return 100;

}catch(Exception e){

System.out.println(“Exception”);

}

catch(ArithmeticException e){

System.out.println(“ArithmeticException”);

}

}

public static void m(){

throw new MyException();

}

}

4.(异常的捕获和抛出)有以下代码:

import java.io.*;

import java.sql.*;

public class TestMyException{

public static void main(String args[]){

try{

System.out.println("main1");

ma();

System.out.println("main2");

}catch(Exception e){

System.out.println("Catch Exception in main");

System.out.println(e.getMessage());

}

}

public static void ma() throws IOException{

try{

System.out.println("ma1");

mb();

System.out.println("ma2");

}catch(SQLException e){

System.out.println("Catch SQLException in ma");

throw new IOException(e.getMessage());

}catch(Exception e){

System.out.println("Catch Exception in ma");

System.out.println(e.getMessage());

}

}

public static void mb() throws SQLException{

throw new SQLException("sql exception in mb");

}

}

问:该程序输出结果是什么?

 

1.问:当读入的 n 分别为 1,2,3,4,5 时,输出的结果分别是什么?

答:当n=1时,输出结果是main 1 ma1 mb1 Catch EOFException In finally main2

当n=2时,main 1 ma1 mb1 Catch IOException In finally main2

当n=3时,main 1 ma1 mb1 Catch SQLExceptionIn finally main2

当n=4时,main 1 ma1 mb1 Catch Exception In finally main2

当n=5时,main 1 ma1  mb1 mb2 ma2 In finally main2

2.创建两个自定义异常类 MyException1 和 MyException2。

要求:

  1. MyException1 为已检查异常,MyException2 为未检查异常

2) 这两个异常均具有两个构造函数,一个无参,另一个带字符串参数,参数表示产生

异常的详细信息。

public class MyException1 extends Exception(){

    public MyException1 (){

    }

    public MyException1 (String str){

        super(str);

    }

}

public class MyException2 extends RunTimeException(){

    public MyException2 (){

    }

    public MyException2 (String str){

        super(str);

    }

}

3.(try-catch)代码改错。

class MyException{}

class TestException{

public static void main(String args[]){

ma();

}

public static int ma(){

try{

m();

return 100;

}catch(ArithmeticException e){

System.out.println(“ArithmeticException”);

}catch(Exception e){

System.out.println(“Exception”);

}

}

public static void m(){

throw new MyException();

}

}

  • 该程序的输出结果是:

main1

ma1

Catch SQLException in ma

Catch Exception in main

sql exception in mb

 

猜你喜欢

转载自blog.csdn.net/Percy0618/article/details/81352036
今日推荐