Java面向对象(三)

Java面向对象(三)

1.1异常,断言与日志

1.1.1异常

程序运行中的一些错误:

  • 代码错误
  • 设备错误
  • 用户输入错误


异常的分类:
·未命名文件 (4).png

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CheckExceptionDemo {
    /**
     *
     * @param name
     * @return
     * @throws FileNotFoundException 告诉编译器可能会出现的异常,异常抛出
     */
    public static FileInputStream getFile(String name) throws FileNotFoundException, IOException {
        return null;

    }
    /**
     * 什么时候需要抛出异常
     * 1.调用一个抛出受查异常的方法的时候;
     * 2.程序运行过程中发生错误,医用throw抛出一个受查异常
     * 3.程序出错,a[-1] = 0 -- 抛出一个非受查异常
     * 4.JVM和java运行时库出现的内部错误
     * 在1,2这种情况,需要告诉这个调用方法可能抛出的异常
     * 注意,1.抛出受查异常(如果受查异常没有抛出,编译器会发出错误信息),不要抛出非受查异常(不可控)
     *      2.Error--内部错误,任何代码都有抛出异常的能力,但是没法控制
     *
     * 关于父子类的异常:
     * 子类重写了父类的一个方法,子类中声明的受查异常不能比父类更通用(<=)(子类可以抛出特定异常,甚至不抛出异常)
     * 如果父类没有抛出异常,子类一定不能抛出
     *
     * 如何抛出一个异常
     * 1.找到一个合适的异常类(或者是自定义,或者是API提供的)
     * 2.创建一个这个类的对象
     * 3将对象抛出
     */
}

public class ArrayExceptionDemo {
    public static void main(String[] args)  {
        int[] a = new int[3];
        try {
        a[-1] = 0;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("异常被捕获了");
            e.printStackTrace();
        }
    }
}
import java.io.IOException;

public class MyMsgException extends IOException {
    public  MyMsgException(){}
    public MyMsgException(String msg){
        super(msg);
    }
}
public class MyExceptionTest {
    public static void print(String str) throws MyMsgException{
        if ("a".equals(str)){
           throw new MyMsgException("a这个参数不合法");
        }
        System.out.println(str);
    }

    /**
     *
     * @param args
     * @throws MyMsgException 抛出一个可能出现的异常
     */
    public static void main(String[] args){
        MyExceptionTest exceptionTest = new MyExceptionTest();
        /**
         * 捕获异常,出现异常程序会中断
         * 可以捕获多个异常
         * catch (MyMsgException  | IOException e)
         */
//        try {
//        print("a");
//        } catch (MyMsgException e){
//            e.printStackTrace();
//            //final finally
//        } finally {
//        System.out.println("你好");
//        }

        int  i = exceptionTest.a();
        System.out.println(i);
    }

    public int a(){
        try {
            print("a");
            //return 3;
        }catch (MyMsgException e){
            e.printStackTrace();
             //return 1;
        }finally {
            System.out.println("执行结束");
            //return 2;
        }
        return 4;
    }
    /**
     * finally语句块
     * 在异常处理后,资源回收的过程
     * 通常情况下finally都会执行,不管是否有异常异常
     * 1在外部有return的情况下会先执行finally再return
     * 2.try或者catch中有return也是先执行finally再return
     * 3.try或者catch中有return finally也有return,返回值会被finally覆盖
     * 在实际的开发中请避免finally中出现return语句
     * ----------------------------------------------------------------
     * finally会执行情况
     * 1.没有异常
     * 2.catch中捕获到异常
     * 3代码抛出异常但是没有被catch捕获try/finally
     * 注意:严格按照try/catch,try/catch/finally,try/finally的结构组织代码
     */
}

未命名文件 (3).png

public class NoExecFinally1 {
        public static void main(String[] args) {
            System.out.println("return value of test(): " + test());
        }

        public static int test() {
            int i = 1;
/**
 * finally不会执行,原因finally对应的try语句块并没有得到执行
 */
//          if(i == 1)
//              return 0;
            System.out.println("the previous statement of try block");
            /**
             * 在执行try语句块签抛出异常,或者程序中断,那么finally也不会执行
             */
            i = i / 0;

            try {
                System.out.println("try block");
                return i;
            }finally {
                System.out.println("finally block");
            }
        }
    }

public class NoExecFinally2 {
        public static void main(String[] args) {
            System.out.println("return value of test(): " + test());
        }

    /**
     * 如果一个线程在执行try语句块的时候被catch捕获变成terminal,或者被kill掉,finally不会执行
     * 或者在线程执行过程中断电司机也不会执行
     * @return
     */
    public static int test() {
            int i = 1;

            try {
                System.out.println("try block");
                /**
                 * 如果让终止java虚拟机finally不会执行
                 */
                System.exit(0);
                return i;
            }finally {
                System.out.println("finally block");
            }
        }
    }

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class TryWithResource {
    /**
     * try(Resource res =)
     * {
     *     code block
     * }
     */
    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
        //带资源的try,try语句块结束后自动调用相关方法释放资源
        try(Scanner in = new Scanner(new FileInputStream("xxx"));
            PrintWriter pw = new PrintWriter("xxx")){

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
import java.util.Scanner;

/**
 * 异常堆栈分析
 */
public class FactorTest {
    //4!
    public static int factor(int n){
        System.out.println("计算"+n+"的阶乘:");
        Throwable throwable = new Throwable();
        StackTraceElement[] frames = throwable.getStackTrace();
        for (StackTraceElement trace : frames){
            System.out.println(trace);
        }
        int res;
        if(n <= 1){
            res = 1;
        }else {
            //画出递归调用树
            //补充作业:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2),递归图n=5
            res = n * factor(n-1);
            System.out.println("返回"+res);
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("输入一个数:");
        int n = in.nextInt();
        factor(n);
    }
}

1.1.2断言

基于一个boolean条件的判断

public class AssertTest {
    public static void method(int x) {
        //assert 条件:表达式;
        assert x >= 0 : x;
    }
    public static void main(String[] args) {
     int i = 11;
     if (i % 3 == 0){
         
     }else if (i % 3 == 1){
         
     }else {
         assert i % 3 == 2;
     }
     
    }
}

1.1.3日志

记录程序的执行过程,错误。

import java.util.logging.Logger;

public class LoggerTest {
    private static final Logger log = Logger.getLogger("com.oop.exception.LoggerTest");

    public static void main(String[] args) {
        log.info("日志信息");
        log.warning("warning");
        log.severe("severe");
        /**
         * 从高到低,默认开启前三个
         * SEVERE
         * WARNING
         * INFO
         * CONFIG
         * FINE
         * FINER
         * FINEST
         */
    }
}
import java.util.logging.Level;
import java.util.logging.Logger;

public class MathLoggerTest {
    //类的全路径
    private static final Logger log = Logger.getLogger("com.oop.exception.MathLoggerTest");
    public static void main(String[] args) {
        int i = 5;
        try {
            i = i / 0;
        }catch (ArithmeticException e){
//            e.printStackTrace();
//           log.severe("除零");
            Logger.getLogger("com.oop.exception.MathLoggerTest").log(Level.WARNING,"运算",e);
        }
    }
}

2.1其他

递归示例
未命名文件 (6).png

posted @ 2020-07-15 21:50  Dave-Mo  阅读(55)  评论(0)    收藏  举报