异常处理

1. final

可以修饰变量–>常量,常量命名全大写.只能被赋值一次,赋值一次之后值不再改变.

final int NUM = 1;

如果final修饰的是一个基本数据类型,则该常量的值在初始化后便不能发生变化;
如果final修饰的是一个引用类型,则该常量在对其初始化之后便不能再指向其他对象了.因为引用的值是一个地址,即地址的值不能发生变化.但是指向的对象的内容可以改变.
当final**修饰一个成员变量(属性)**时,有两种初始化方式:1.在变量声明时初始化;2.在声明时不赋值,但是要在该类的构造函数中对变量赋值;修饰局部常量时可以先声明后赋值.

当final修饰的是方法时,方法是只读型的,即可以读取使用改参数,但是无法改变.
final修饰的方法表示此方法已经是”最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。)

…没看懂
//子类无法重写父类的构造方法;

当用final修饰一个时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

String也是最终类

2.异常处理

Throwable是是有异常的父类
Error:虚拟机在运行时产生的错误,一旦产生虚拟机直接关闭,无法解决,只能避免

Exception是所有异常类的父类

分类:
运行时异常:在运行过程中,根据数据等情况产生的异常 uncheck
exception(Runtime exception)
非运行时异常:1)在编译时报错;2)必须对代码进行异常处理 check
exception(exception及除了Runtime exception之外的子类)

常见运行时异常:
ArithmeticException 算术异常-数学计算过程中异常
InputMismatchException 输入类型不匹配异常-没有重写父类的

getMessage() 返回字符串:异常原因
printStackTrace()
打印出方法在堆栈调用过程中的异常信息,包括getMessage()中的信息

异常处理方式:1)捕获 2)抛出
捕获:

try{
    int i = 1 / 0;
}
catch(Exception e){
    e.printStackTrace();
}
finally{
    System.out.println("");//无论是否产生异常都执行
}

finally中常用来做清理工作,如关闭文件,关闭数据库等.

多路捕获:

try{
}catch(异常类型1 ex){
}catch(异常类型2 ex){
}catch(异常类型3 ex){
}

注意:多路捕获异常中,父类异常一定要出现在最后.
原因:在捕获异常时 是从上往下匹配的.

异常处理方式二:抛出异常 throw-throws

public class ThrowTest{
    public void test()throws Exception{    //2.在方法()的后面通过throws关键字把方法体内引发的异常抛出,抛出的异常类型必须和方法体内异常类型一致或是其父类
        throw new Exception("测试抛出异常");
        //1.引发一个异常
    }
}

public class User{
    private int age;
    public void setAge(int age){
        if(age<0){
        RuntimeException r = new RuntimeException("年龄不能为负数");//生成一个异常对象
        throw e;
    }
}

关于==和equals
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型:
==比较的是内存存放地址,equals初始也是比较内存地址,但是在String
中equals被覆盖为比较值,返回值为Boolean.