1.Error和Exception的联系?
继承关系:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。
Error和RuntimeException及其子类被称为未检查异常(Unchecked exception),其它异常称为受检查异常(Checked Exception)。
2.Error和Exception的区别?
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存不足,方法调用栈溢出等。如Java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能的处理异常,使程序恢复运行,而不应该随意终止异常。
3.运行时异常和受检查异常?
Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception)。
RuntimeException:其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即时没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零的ArithmeticException、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。
受检查异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译器是通不过的。这是在应用环境中出现的外部错误。
throw 、throws 、try -catch、 finally详解?
throw : 将产生的异常抛出(强调的是动作),抛出的既可以是异常的引用,也可以是异常对象。(位置: 方法体内)
throws : 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。用它修饰的方法向调用者表明该方法可能会抛出异常(可以是一种类型,也可以是多种类型,用逗号隔开)(位置: 写在方法名 或方法名列表之后 ,在方法体之前。
)
try中存放的事可能有异常的代码。如果try代码中发生异常,那么异常代码之后的代码不会被执行。
try中生命的变量,在出了try代码块后,将无效。
catch语句将异常类型小的放在异常类型大的上面。
在{}中给出异常的处理意见:e.printStackTrace() ,sysout(e.getMessage);
finally:不管是否发生异常,都会被执行:try中是否有异常,catch中是否有异常:catch中是否有return、
catch和finally是可选。
异常可以嵌套。
throws:如果在方法中抛出了异常,但方法不知道如何处理,那么就通过throws的形式,将异常往上抛,交给方法的调用者来处理。(一般都是jvm来出来,往后抛到jvm那里去了)
异常,既可以是jdk提供给我们的异常类,也可以使我们自己定义的异常类。
如果是jdk提供给我们的话,那么当出现异常类的时候,程序会自动生成一个对应异常类的对象,然后抛出此对象。
如果是自定义的异常,需要在程序中显式的将这个异常对象抛出,如何抛出?使用throw关键字。
throw关键字:定义在方法内部,通过"throw 自定义异常类的对象"格式,抛给方法。
如何自定义异常类?
a:自定义异常类继承现有的异常类(一般情况下,继承RuntimeException)
b:写几个重载的构造器
c:static final logn serialVersionUID=948L;
4.throw和throws两个关键字有什么不同?
throw是用来抛出任意异常的,你可以抛出任意Throwable,包括自定义的异常类对象;throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。如果方法抛出了异常,那么调用这个方法的时候就需要处理这个异常。
5.try-catch-finally-return执行顺序?
1> 不管是否有异常产生,finally块中代码都会执行;
2> 当try和catch中有return语句时,finally块仍然会执行;
3> finally是在return后面的表达式运算执行的,所以函数返回值在finally执行前确定的,无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值;
4> finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
6.常见的几种RunException?
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常
IllegalArgumentException - 传递非法参数异常
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
NegativeArrayException - 数组负下标异常
EOFException - 文件已结束异常
FileNotFoundException - 文件未找到异常
SQLException - 操作数据库异常
IOException - 输入输出异常
NoSuchMethodException - 方法未找到异常
java.lang.AbstractMethodError - 抽象方法错误。当应用试图调用抽象方法时抛出。
java.lang.AssertionError - 断言错。用来指示一个断言失败的错误。
java.lang.ClassCircularityError - 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。
java.lang.ClassFormatError - 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时输出。
java.lang.Error - 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。
7.java虚拟机能自动处理的异常是什么?
运行异常
8.Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
9.final, finally, finalize的区别。
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
10.自定义异常?
首先,我们来看一下错误和异常的父类;
//自定义异常类:
自定义异常类,需要继承Throwable或Exception,并且重写printStackTrace()方法,此方法就是自定义异常的执行结果。
在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类,在构造方法中使用super语句调用Exception的构造方法即可。
实例如下:
11.运行时异常与一般异常有何异同?
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。checked 异常。对于后者这种异常,JAVA要求程序员对其进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。