java基础之异常

来源:互联网 发布:mac 推出硬盘 编辑:程序博客网 时间:2024/05/16 16:20
异常的定义
异常是指使运行的程序中断或者停止的的事件,这些事件通常是由硬件或者程序逻辑不当引起的,对这些事件的捕获和处理可以增强代码的健壮性。可以有效的防止程序由于异常或错误而被迫停止。
异常的分类
在java里异常可以分为错误和异常,错误是由于java虚拟机或者硬件出错导致的,这些大都是人为不可控的,异常一般是由于代码逻辑引起的,我们可以对其进行捕获并进行处理,无特殊说明,异常以后指第二类。异常又可分为检查异常和非检查异常,也可分为非运行时异常和运行时异常。检查异常和非运行时异常是指在编译前就需要捕获和处理的异常,比如FileNotFindException,EOFException。非检查异常和运行时异常在编译期间不需要对其进行捕获处理,但是在运行时可产生,比如空指针异常,类未找到异常,非法参数异常,数组越界异常等。
异常里的关键字
    异常机制里有5大关键字:try catch finnaly throw throws
    try:它后面是一个代码块,代码块里是可能发生异常的代码。
    catch:它后面是可能发生异常的类型以及异常发生后需要做的处理
    finally:后面是一个代码块,主要是异常发生时资源释放问题(在异常块中,必须要执行的语句块)
    throws:出现在函数头,用来标注抛出异常的类型
    throw:  位于函数代码块里,用于在一定条件下抛出什么异常
异常语句格式
try{
//有可能发生异常的语句块
}catch (Exception e){
//异常的处理
}finnaly {
//不管有没有发生异常,都必须执行的语句块
}
自定义异常
     自定义异常分为自定义非检查异常(运行时异常)和自定义检查异常(非运行时异常)。只有继承RuntimeException的自定义异常是非检查异常(运行时异常),其余的都是检查异常(非运行时异常)。使用throw抛出自定义非检查异常(运行时异常)时不需要进行try{}catch(){}或者throws处理,但是使用throw抛出自定义检查异常(非运行时异常)时一定要进行try{}catch(){}或者throws处理,否则编译无法通过。
     自定义异常一般都是重写自定义异常类的构造函数,然后通过throw关键字抛出该异常


常见的异常面试题
1.什么是Java异常
答:异常是发生在程序执行过程中阻碍程序正常执行的错误事件。比如:用户输入错误数据、硬件故障、网络阻塞等都会导致出现异常。 只要在Java语句执行中产生了异常,一个异常对象就会被创建,JRE就会试图寻找异常处理程序来处理异常。如果有合适的异常处理程序,异常对象就会被异常处理程序接管,否则,将引发运行环境异常,JRE终止程序执行。 Java异常处理框架只能处理运行时错误,编译错误不在其考虑范围之内。
2.Java异常处理中有哪些关键字?
答:
  • throw:有时我们需要显式地创建并抛出异常对象来终止程序的正常执行。throw关键字用来抛出并处理运行时异常。
  • throws:当我们抛出任何“被检查的异常(checked exception)”并不处理时,需要在方法签名中使用关键字throws来告知调用程序此方法可能会抛出的异常。调用方法可能会处理这些异常,或者同样用throws来将异常传给上一级调用方法。throws关键字后可接多个潜在异常,甚至是在main()中也可以使用throws。
  • try-catch:我们在代码中用try-catch块处理异常。当然,一个try块之后可以有多个catch子句,try-catch块也能嵌套。每个catch块必须接受一个(且仅有一个)代表异常类型的参数。
  • finally:finally块是可选的,并且只能配合try-catch一起使用。虽然异常终止了程序的执行,但是还有一些打开的资源没有被关闭,因此,我们能使用finally进行关闭。不管异常有没有出现,finally块总会被执行。
3.描述一下异常的层级。
答:Java异常是层级的,并通过继承来区分不同种类的异常。
  • Throwable是所有异常的父类,它有两个直接子对象Error,Exception,其中Exception又被继续划分为“被检查的异常(checked exception)”和”运行时的异常(runtime exception,即不受检查的异常)”。 Error表示编译时和系统错误,通常不能预期和恢复,比如硬件故障、JVM崩溃、内存不足等。
  • 被检查的异常(Checked exception)在程序中能预期,并要尝试修复,如FileNotFoundException。我们必须捕获此类异常,并为用户提供有用信息和合适日志来进行调试。Exception是所有被检查的异常的父类。
  • 运行时异常(Runtime Exception)又称为不受检查异常,源于糟糕的编程。比如我们检索数组元素之前必须确认数组的长度,否则就可能会抛出ArrayIndexOutOfBoundException运行时异常。RuntimeException是所有运行时异常的父类。
4.Java中的检查型异常和非检查型异常有什么区别?
  这又是一个非常流行的Java异常面试题,会出现在各种层次的Java面试中。检查型异常和非检查型异常的
主要区别在于其处理方式。检查型异常需要使用try, catch和finally关键字在编译期进行处理,否则会出现编译
器会报错。对于非检查型异常则不需要这样做。Java中所有继承自java.lang.Exception类的异常都是检查型
异常,所有继承自RuntimeException的异常都被称为非检查型异常。你也可以查看下一篇文章来了解
 更多关于检查型异常和非检查型异常之间的区别。
5.在Java异常处理的过程中,你遵循的那些最好的实践是什么?
  这个问题在面试技术经理是非常常见的一个问题。因为异常处理在项目设计中是非常关键的,所以精通异常处
理是十分必要的。异常处理有很多最佳实践,下面列举集中,它们提高你代码的健壮性和灵活性:
1) 调用方法的时候返回布尔值来代替返回null,这样可以 NullPointerException。由于空指针是java异常里最恶
心的异常。
2) catch块里别不写代码。空catch块是异常处理里的错误事件,因为它只是捕获了异常,却没有任何处理或者
提示。通常你起码要打印出异常信息,当然你最好根据需求对异常信息进行处理。
3)能抛受控异常(checked Exception)就尽量不抛受非控异常(checked Exception)。通过去掉重复的异常处
理代码,可以提高代码的可读性。
4) 绝对不要让你的数据库相关异常显示到客户端。由于绝大多数数据库和SQLException异常都是受控异常,在Java中,
你应该在DAO层把异常信息处理,然后返回处理过的能让用户看懂并根据异常提示信息改正操作的异常信息。
5) 在Java中,一定要在数据库连接,数据库查询,流处理后,在finally块中调用close()方法。
6.  throw 和 throws这两个关键字在java中有什么不同?
一个java初学者应该掌握的面试问题。 throw 和 throws乍看起来是很相似的尤其是在你还是一个java初学者的时
候。尽管他们看起来相似,都是在处理异常时候使用到的。但在代码里的使用方法和用到的地方是不同的。throws
总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常, 你也可以申明未检查的异常,但这不是编译
器强制的。如果方法抛出了异常那么调用这个方法的时候就需要将这个异常处理。另一个关键字  throw 是用来
抛出任意异常的,按照语法你可以抛出任意 Throwable (i.e. Throwable 或任何Throwable的衍生类) , throw
可以中断程序运行,因此可以用来代替return . 最常见的例子是用 throw 在一个空方法中需要return的地方抛出 UnSupportedOperationException 代码如下 :
 
1     private static voidshow() {  
2          throw new UnsupportedOperationException(“Not yet implemented”);
3      }