文章目录
异常
Exception和Error有什么区别
Exception可以通过throw或者try catch进行处理,而error是程序无法处理的异常。例如JVM虚拟机错误等。
CheckedException和RuntimeException有什么区别?
CheckedException是编译期异常,在编译时就可以检查出来的。受检异常必须被throw或者catch否则程序无法通过编译。
RuntimeException是运行时异常,在编译期无法发现,当程序开始执行的时候才会发现。
Throwable 类常用方法有哪些?
String getMessage()
: 返回异常发生时的简要描述
String toString():
返回异常发生时的详细信息
String getLocalizedMessage()
: 返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同
void printStackTrace()
: 在控制台上打印 Throwable 对象封装的异常信息
try-catch-finally 如何使用?
try块用于捕获异常,后面可以接0或多个catch块,catch、块用于处理异常,如果没有catch则需要一个finally块,finally块一般用于关闭资源,不论程序是否捕获异常,finally中的语句都会被执行。
注:try和finaly中的return语句会被保存在同一个变量中,如果try和finally中都有return语句try中的值会被覆盖。
如何使用 try-with-resources
在Java7之前,我们需要在finally块中手动关闭资源,当资源数量比较多时,整个方法就有一些繁琐了。因此Java7推出了一个语法糖,在try的括号中写上需要关闭的资源的声明语句,多个资源使用分号分开,无需我们手动书写关闭资源的代码。
泛型
泛型的实质是参数化类型,在定义这个方法的时候我们还不能够确定这个地方我们传入的是一个什么类型,这时候就可以用字母T或者E来表示,用什么都可以。在实际编译的时候编译器会确定整个泛型最终是什么,进行类型擦除,就是找到你传入的类型去代替掉原本的泛型。
原始类型就是被擦除类型之后,替换掉泛型的真实类型。如果没有指定。泛型会被替换为Object。
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
静态泛型方法是没有办法使用在类上声明的泛型的,因为静态方法的加载优先于类的实例化。
反射
反射可以获取和调用任意一个类的所有属性和方法。关键是获得对象的Class实例。一个类在JVM中Class实例只有一个。
//1、通过对象调用 getClass() 方法来获取
Person p1 = new Person();
Class c1 = p1.getClass();
//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
Class c2 = Person.class;
//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
Class c3 = Class.forName("com.ys.reflex.Person");
Class类的常用方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
反射的实际应用场景
动态代理、spring的自动装配和注解。
注解
I/O
序列化:对象->二进制字节流
反序列化:二进制字节流->对象
对于不想进行序列化的变量,使用 transient 关键字修饰。
static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。
获取用键盘输入常用的两种方法
方法 1:通过 Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
方法 2:通过 BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
既然有了字节流,为什么还要有字符流?
字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。