java se遗漏知识点

最近准备面试,把Java se的一些遗漏的基础知识复习一遍。
Java的两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,理论上能够表示无限大的数。

由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal.

        public static void main(String args[]) {

//      double a = 0.01;
//      double b = 0.09;
//      System.out.println(a+b); // 得到:  0.09999999999999999,精度缺失

        BigDecimal big1 = new BigDecimal("0.01");
        BigDecimal big2 = new BigDecimal("0.009");
        System.out.println("Bigdecimal的默认标度:"+big1.scale()); //默认标度就是原始数值的小数部分位数,这里为2位
        //加
        System.out.println(big1.add(big2)); // 准确的数值:0.019,面对金额或高精度计算,必须采用BigDecimal
        //减
        System.out.println(big1.subtract(big2));  // 结果:0.001,结果精度 = 数值中精度较大者
        //乘
        System.out.println( big1.multiply(big2));  // 0.00009: 得到的数值精度 = big1.scale() + big2.scale()

        //除
        System.out.println( big1.divide(big2,2));  //得到1.12
        System.out.println( big1.divide(big2,3));  //得到1.11  ,这个才是准确的

        //所以在进行除法运算的时候,先对两个数的scale(标度)进行比较,选择较大者的标度作为结果的标度
        int scale = big1.scale()>big2.scale()?big1.scale():big2.scale();
        System.out.println(big1.divide(big2,scale));  //1.11

        BigInteger bi1 = new BigInteger("20");
        BigInteger bi2 = new BigInteger("10");
        // 加 add(BigInteger val)
        System.out.println("add:" + bi1.add(bi2));
        // 减 subtract(BigInteger val)
        System.out.println("subtract:" + bi1.subtract(bi2));
        // 乘 multiply(BigInteger val)
        System.out.println("multiply:" + bi1.multiply(bi2));
        // 除 divide(BigInteger val)
        System.out.println("divide:" + bi1.divide(bi2));
    }

异常体系结构图:

这里写图片描述

Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

Exception(异常):是程序本身可以处理的异常。

通常我们把java的异常体系分为可查异常(checked exceptions)不可查异常(unchecked exceptions)。
可查异常:指编译器可以检查出程序书写时就有可能出现异常,所以需要捕获,即try-catch。
不可查异常:Error及其子类,还有RuntimeException,不需要处理,但是需要我们避免的。例如,试图使用空值对象引用、除数为零或数组越界。

finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。

finally问题:
当finall块中包含return语句时,Eclipse会给出警告“finally block does not complete normally”,原因分析如下:

1、不管try块、catch块中是否有return语句,finally块都会执行。
2、finally块中的return语句会覆盖前面的return语句(try块、catch块中的return语句),所以如果finally块中有return语句,Eclipse编译器会报警告“finally block does not complete normally”。

3、如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。

结论,应避免在finally块中包含return语句。如果你在前面的语句中包含了return语句或重新抛出了异常,又在finally块中包含了return语句,说明你概念混淆,没有理解finally块的意义。

猜你喜欢

转载自blog.csdn.net/zhulidie/article/details/72844699