1、Java语言中的异常有几种,分别是什么?
题目要求的是异常种类有什么,异常是程序中断的一种指令。分为受检异常(需要抛出异常)和非受检异常(无需抛出异常)。也被成为编译时异常和运行时异常。非受检异常主要是RuntimeException类及其子类。
扩展:Throwable是所有异常的基类,它有两个直接子类Error类和Exception类。Error类被用来表示系统错误,崩溃,一般尽量避免这类问题出现。Exception类是所有受检时异常的父类。RuntimeException(是 Exception 的子类) 是所有不受检查异常的基类。
受检查的异常应该用 try-catch 块代码处理或用 throws 关键字抛出;
非受检查的异常在程序中不要求被处理或用 throws 抛出;
2、final、 finalize 与finally 三者之间的区别
final 是修饰符,用作修饰类,属性,方法。用final修饰的对象不可被继承,但是内容可变
finalize 是方法名,在垃圾收集器执行的时候会调用 被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等
finally是异常处理结构的一部分,表示总是执行(在部分情况下还是不会执行的)
3、java 中 throw 与 throws 的区别
throw 使用的位置在方法中,后面跟的异常对象实例,(throw new 异常名)表示抛出异常,由方法体内语句处理,如果方法中有 throw 抛出 RuntimeException 及其子类则声明上可以没有 throws,如果方法中有 throw 抛出 Exception 及其子类则声明上必须有 throws。
throws 使用的位置在方法参数小括号后面,后面跟的是一个或者多个异常类名且用逗号隔开,表示抛出异常并交给调用者去处理,如果后面根据的是 RuntimeException 及其子类则该方法可以不用处理,如果后面根据的是 Exception 及其子类则必须要编写代码进行处理或者调用的时候抛出。
4、什么时候使用throw,什么时候使用throws
对于JVM来说错误不是错误比如 age=-100,在我们看来年龄怎么可能是负的呢?那么我们就需要手动抛出异常 throw new Exception()
throws是方法可能抛出的异常,在定义方法的时候告诉可能会产生异常,如果产生了异常,那么这个异常会被方法抛出,那么由谁来处理呢?由调用这个方法的对象来处理,如果这个对象又往上抛,到JVM还没被处理掉,JVM就会发出中断指令。类似于 下属遇到影响项目的重大问题没办法解决,交给组长,组长也没办法解决交给上级……CTO也没办法就中断这个项目。
5、java 中 Error 和 Exception 有什么区别
Error 表示系统级的错误,是 java 运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是 java 虚拟机抛出的。需要尽量避免这类问题出现。
Exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序可以处理的问题。
6、java 异常链
异常链是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条,大多用于将受检查异常(checked exception)封装成为非受检查异常(unchecked exception)。特别注意如果你因为一个异常而决定抛出另一个新的异常时一定要包含原有的异常。
7、finally包含的语句块 一定会执行吗?
finally语句块只有一种情况不会执行,只有在 try 里面通过 System.exit(0) 来退出 JVM 的情况下 finally 块中的代码才不会执行,其他 return 等情况都会调用,所以在不终止 JVM 的情况下 finally 中的代码一定会执行。
如下代码表示
public static void main(String[] args) {
int a=haha();
System.out.println(a);
}
public static int haha(){
int a=10;
try {
return a;
}catch (Exception e){return 0;}
finally {
a=20;
}
}
return的是a的备份值,执行finally语句改变的是a的值,备份值没有发生改变。所以结果是10;
public static void main(String[] args) {
Person p = print();
System.out.println(p.age);
}
public static Person print(){
Person p=new Person();
try {
p.age=10;
return p;
}catch (Exception e){return null;}
finally {
p.age=2;
}
}
static class Person{
int age;
}
这段代码创建了一个内部类,内部类再堆里面开辟了一个内存空间,将内存空间的地址赋值给栈里面一个叫p的名字。return返回的是p对应的堆地址空间的备份值,这个时候执行finally语句,将堆内的age该为2。备份值对应的是堆内空间地址,所以结果是2;
try-catch-finally语句只有在这样的情况下不会执行finally语句。(还有电脑关机等程序被关闭等情况)
public static void main(String[] args) {
try {
System.exit(0);
}catch (Exception e){
}finally {
System.out.println("我是finally");
}
}
还会持续更新。。。