Java学习Day19--异常(下)

异常的方法

处理异常的三种解决方法

1.给用户提示

try {
    
    
        int x=10;
        int y =0;
        int t = x/y;
        System.out.println("可能异常后面的代码");
    }catch (Exception e){
    
    
        System.out.println("有异常,不知道啥异常");//异常处理1.给用户提醒
    }

2.直接将异常信息打印在控制台

try {
    
    
        int x=10;
        int y =0;
        int t = x/y;
        System.out.println("可能异常后面的代码");
    }catch (Exception e){
    
    
    //使用e.getMessage ();直接将异常打印在控制台  
        System.out.println(e.getMessage()); 
    }

3.记录日志:异常的信息记录在文件中

public static void main(String[] args) throws FileNotFoundException {
    
    
try {
    
    
        int x=10;
        int y =0;
        int t = x/y;
        System.out.println("可能异常后面的代码");
    }catch (Exception e){
    
    
       //打印输出异常的信息,记录日志:异常的信息记录在文件中,需要throws FileNotFoundException; 打印在E盘log.txt文件中
      /*e.printStackTrace("E:\\log.txt");*/
     PrintWriter p = new PrintWriter("E:\\log.txt");
        e.printStackTrace(p);
        p.flush();
        p.close();//关闭与文件的通道,如果没有,文件一直在程序中被占用
     
    }
        System.out.println("后面的代码");
    }

Finally

/**
         try{
           可能出现异常的代码
        }catch (异常类型(只捕获指定类型的异常)){
            处理异常
        }finally {
            无论try,catch 中出现异常,也会先执行finally中的内容
        }


         try{
         可能出现异常的代码
         }finally {
         try+finally,没有进行异常处理,try中一旦出现问题,后面的代码就结束运行
         }
         System.out.println("后面的代码");
 */
public class FinallyDemo1 {
    
    
    public static void main(String[] args) {
    
    
        FinallyDemo1 f = new FinallyDemo1();
        System.out.println(f.Test(10,0));
    }

    public int Test(int x , int y){
    
    
        try{
    
    
           return x/y;
        }catch (Exception e){
    
    
            return -1;
        }finally {
    
    
            /*
            即使try,catch 中出现异常,已经返回值,但也会先执行finally中的内容
             */
            System.out.println("Finally 中的代码");
        }
    }
}

throws

定义一个方法时可以使用throws关键字声明,表示此方法不处理异常,而是交给方法调用处进行处理

声明:public void test() throws 异常1,异常2{

}

使用了throws的方法,调用时必须处理声明的异常,要么try-catch,要么继续使用throws声明
    /**
     * throws:作为方法的声明,声明此方法中可能出现的某种异常,调用时,需要注意
     */
    public static void main(String[] args) {
    
    
        Demo4 d4 = new Demo4();
        try {
    
    
            d4.Meth1();
        } catch (UnsupportedEncodingException e) {
    
    
            e.printStackTrace();
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
        }

    }


    public void Meth1() throws UnsupportedEncodingException, FileNotFoundException {
    
    
        Meth2();
    }
    //声明此方法可能会出现异常,可以声明多个,一般多为编译期异常
    public void Meth2() throws UnsupportedEncodingException, FileNotFoundException {
    
    
        try {
    
    
            "abc".getBytes("utf-8");
        } finally {
    
    
            System.out.println("需要执行的代码");
        }
    }
任何方法都可以使用throws关键字声明异常类型,包括抽象方法
子类重写父类的方法时,子类方法不能声明抛出比父类类型更大的异常
public abstract class Demo5 {
    
    

    public abstract void test() throws UnsupportedEncodingException;
}


public abstract class Demo5Son extends Demo5{
    
    

    /**
    子类中重写方法,声明的异常类型小于或等于父类的异常类型
     */
    @Override
    public void test() throws UnsupportedEncodingException {
    
    
    }
}

throw

用于显示抛出异常,抛出时抛出的是一个异常类的实例化对象

语法:throw throw new 异常类构造方法

public class Demo6 {
    
    
    public static void main(String[] args) throws SorcseException {
    
    
        Demo6 d6=new Demo6();
        try {
    
    
            System.out.println(d6.checkScore(101));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    public String checkScore(int score) throws SorcseException{
    
    
        if (score<0||score>100){
    
    
            //当不满足某种条件时,在方法中显示的抛出一个异常对象,执行后后面的代码就不执行
            throw new RuntimeException();
        }
        if (score>90){
    
    
            return "优秀";
        }else{
    
    
            return "不优秀";
    }
    }
}

自定义异常

用自定义异常标记业务逻辑的错误,避免与标准异常混淆

public class Demo6 {
    
    
    public static void main(String[] args) {
    
    
        Demo6 d6 = new Demo6();
        try {
    
    
            d6.checkScore(101);
        } catch (Exception e) {
    
    
            e.getMessage();
            e.printStackTrace();
        }
    }
        public String checkScore ( int score) throws ScoreException {
    
    
            if (score < 0 || score > 100) {
    
    
                throw new ScoreException("成绩不合法");
            }
            if (score > 90) {
    
    
                return "优秀";
            } else {
    
    
                return "不优秀";
            }
        }
}

/*
自定义异常类:根据业务逻辑的需要,来指定一种场景下的异常类
 */
public class ScoreException extends Exception{
    
    

    public ScoreException(String message) {
    
    
        super(message);
    }
}

throw和throws区别(this super )

  1. throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try-catch 捕获异常,要么throws声明异常
  2. throws用于方法声明处,用来声明该方法可能会产生的异常类型,可以是多个异常类型,用来强制调用该方法时处理这些异常
  3. throws可用于抽象方法

猜你喜欢

转载自blog.csdn.net/XiaoFanMi/article/details/111242543
今日推荐