1.Java中什么是Exception?

异常是Java传达给你的系统和程序错误的方式。

在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之类的类,然后还有一些处理异常时候的关键字,比如throw,throws,try,catch,finally之类的。 所有的异常都是通过Throwable衍生出来的。Throwable把错误进一步划分为 java.lang.Exception 和 java.lang.Error。

java.lang.Error 用来处理系统错误,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之类的。

然后 Exception用来处理程序错误,请求的资源不可用等等。

2.Java的异常体系

在Java中异常Exception和错误Error有个共同的父类Throwable。

3. 异常和错误的区别

错误:常见的有程序进入死循环,内存泄漏等。这种情况,程序运行时本身无法解决,只能通过其他方法干预。对应的类为Error类

异常:常见的有除数为0,数组越界等。这种情况,不向错误那样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行直至正常结束。对应的类为Exception类。

抛出异常:当程序发生异常时,产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常,这个过程称为抛出异常。

捕获异常:异常抛出后,运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应处理的方法,并把异常对象交给该方法为止,这个过程称为捕获异常。

4.运行时异常和非运行时异常

非运行时异常(Checked Exception)

Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常

运行时异常(Runtime Exception/Unchecked Exception)

RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException.

5.异常处理的一般原则 

对应非运行时异常,必须对其进行处理。

处理方式有两种:

使用try…catch…finally语句块进行捕获
在产生异常的方法所在的方法声明throws Exception

对于运行时异常,可以不对其进行处理,也可以对其进行处理,一般情况下都不对其进行处理。

6.throw 和 throws这两个关键字在java中有什么不同?

区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;

throw语法:throw <异常对象> 

在方法声明中,添加throws子句表示该方法将抛出异常。

throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]

其中:异常类可以声明多个,用逗号分割。

区别二:throws可以单独使用,但throw不能;

区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

7.自定义异常

自定义异常通常是定义一个继承自Exception类的子类。一般情况下我们都会直接继承自Exception类,而不会继承某个运行时的异常类。

创建自定义异常:

public class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String msg){
        super(msg);
    }
}

在类中使用异常:

public class ExceptionTest {

    public static void execute(String a) throws MyException {
        System.out.println("execute...");
        if("true".equals(a)){
            throw new MyException("参数不能为 true");
        }
    }
} 

捕获自定义异常:

public static void main(String[] args) throws MyException {
    execute("true");
}

自定义异常的一般过程:

自定义异常:
class 异常类名 extends Exception
{
    public 异常类名(String msg)
    {
        super(msg);
    }
}  

标识可能抛出的异常:
throws 异常类名1,异常类名2 

捕获异常:
try{}
catch(异常类名 y){}
catch(异常类名 y){} 

方法解释
getMessage() //输出异常的信息
printStackTrace() //输出导致异常更为详细的信息 

8.常见的异常类

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException

操作数据库异常:SQLException

输入输出异常:IOException

方法未找到异常:NoSuchMethodException

9.如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?

了解finally块是怎么执行的,即使是try里面已经使用了return返回结果的情况,对了解Java的异常处理都非常有价值。

只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。

10.Java中final,finalize,finally关键字的区别

final和finally是Java的关键字,而finalize则是方法。final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。

而finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用。

11.下面的代码都有哪些错误:

public class SuperClass {
		public void start() throws IOException{ throw new IOException(“Not able to open file”); }	}

	public class SubClass extends SuperClass {
		public void start() throws Exception{ throw new Exception(“Not able to start”); }	}

这段代码会在捕捉异常代码块的RuntimeException类型变量“re”里抛出编译异常错误。因为Exception是RuntimeException的父类,在start方法中所有的RuntimeException会被第一个捕捉异常块捕捉,

这样就无法到达第二个捕捉块,这就是抛出“exception java.lang.RuntimeException has already been caught”的编译错误原因。

这段代码编译器将对子类覆盖start方法产生不满。因为每个Java中方法的覆盖是有规则的,一个覆盖的方法不能抛出的异常比原方法继承关系高。因为这里的start方法在父类中抛出了IOException,所有在子类中的start方法只能抛出要么是IOExcepition或是其子类,但不能是其超类,如Exception。

12.下面的Java异常代码有什么错误:

public static void start(){
System.out.println(“Java Exception interivew question Answers for Programmers”);
}
public static void main(String args[]) {
 try{
start();
}
catch(IOException ioe){
 ioe.printStackTrace();
 }
}

上面的Java异常例子代码中,编译器将在处理IOException时报错,因为IOException是受检查异常,而start方法并没有抛出IOException,所以编译器将抛出“异常, java.io.IOException 不会在try语句体中抛出”,但是如果你将IOException改为Exception,编译器报错将消失,因为Exception可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。

参考

Java的Exception和Error面试题10问10答

关于Java异常和错误的几个问题的更多相关文章

  1. java异常和错误类总结(2016.5)

    看到以前2016.5.写的一点笔记,拿过来放在一起. java异常和错误类总结 最近由于考试和以前的面试经常会遇到java当中异常类的继承层次的问题,弄得非常头大,因为java的异常实在是有点多,很难 ...

  2. Java异常及错误

    java提供了两种异常机制,可以分为运行时异常(RuntimeException)与检查式异常(checked Exception). 检查式异常:java编译器对于这种异常需要我们对其用try... ...

  3. Java异常与错误

    Java错误与异常 三种类型的异常 检查性异常:用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略 运行时异常:运行时异常是 ...

  4. java异常和错误相关

    1.挺常见的一个问题,是个error java.lang.NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时 也就是说你如果编译了一个类B,在类A中调用,编译完成 ...

  5. 浅析Java异常

    1.什么是异常 结构不佳的代码不能运行,这是Java的基本理念. 发现错误的理想时机是在编译期.然而,编译器并不能发现所有的错误,余下的问题就需要在程序运行时解决.这就需要错误能通过某种方式,把适当的 ...

  6. 《java中异常和错误》

    异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...

  7. Java异常错误的面试题及答案

    1) Java中什么是Exception? 这个问题经常在第一次问有关异常的时候或者是面试菜鸟的时候问.我从来没见过面高级或者资深工程师的 时候有人问这玩意,但是对于菜鸟,是很愿意问这个的.简单来说, ...

  8. java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  9. java的常见异常与错误总结

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

随机推荐

  1. Hbase Shell常用命令

    hbase shell常用的操作命令有create,describe,disable,drop,list,scan,put,get,delete,deleteall,count,status等,通过h ...

  2. linux 多线程 LinuxThreads(转)

    Linux 线程实现机制分析 http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 上面文章分析的非常透彻 按照教科书上的定义,进程是 ...

  3. dede5.7前台插入恶意JS代码

    这个问题应该很久了 最近发现有用这个的蠕虫,dede 前台提交友情链接 只用htmlspecialchars简单处理了一下 可以插入代码plus/flink_add.php 提交: 表单中提交 图片地 ...

  4. WebService学习总结(三)——使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  5. angular-ngSanitize模块-linky过滤器详解

    本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个 ...

  6. cocos基础教程(12)点击交互的三种处理

    1.概述 游戏也好,程序也好,只有能与用户交互才有意义.手机上的交互大致可以分为两部分:点击和输入.其中点击更为重要,几乎是游戏中全部的交互.在Cocos2d-x 3.0中,更改了dispatch机制 ...

  7. Spring常用的接口和类(二)

    七.BeanPostProcessor接口 当需要对受管bean进行预处理时,可以新建一个实现BeanPostProcessor接口的类,并将该类配置到Spring容器中. 实现BeanPostPro ...

  8. 理解Java中的接口

    一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...

  9. 2015-2-10 Linux 知识

    1.Linux系统中某个可执行文件属于root并且有setid,当一个普通用户mike运行这个程序时,产生的进程的有效用户和实际用户分别是____? A root mike B root rooy C ...

  10. 反正切函数求圆周率 atan

    #define PI atan(1.0)*4 原理:tan ∏/4=1; atan2: 返回给定的 X 及 Y 坐标值的反正切值.反正切的角度值等于 X 轴正方向与通过原点和给定坐标点 (Y坐标, X ...