所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象。


JAVA遇到异常不终止继续往下执行 java异常报错_异常

从大体来分异常为两块:

1、error---错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

2、Exception --- 异常 :异常可分为运行时异常跟编译异常

  •  1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
  •  2)编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

3、java处理异常的机制:抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。

4、throw跟throws的区别:

public void test() throws Exception {
    throw new Exception();
}

从上面这一段代码可以明显的看出两者的区别。throws表示一个方法声明可能抛出一个异常,throw表示此处抛出一个已定义的异常(可以是自定义需继承Exception,也可以是java自己给出的异常类)。

5、接下来看一下如何捕获异常:

1)首先java对于异常捕获使用的是try---catch或try --- catch --- finally 代码块,程序会捕获try代码块里面的代码,若捕获到异常则进行catch代码块处理。若有finally则在catch处理后执行finally里面的代码。然而存在这样两个问题:

a.看如下代码:

try{
    //待捕获代码
}catch(Exception e){
    System.out.println("catch is begin");
    return 1 ;
}finally{
     System.out.println("finally is begin");
}

在catch里面有一个return,那么finally会不会被执行呢?答案是肯定的,上面代码的执行结果为:

catch is begin
finally is begin

也就是说会先执行catch里面的代码后执行finally里面的代码最后才return1;

b.看如下代码:

try{
   //待捕获代码    
}catch(Exception e){
    System.out.println("catch is begin");
    return 1 ;
}finally{
     System.out.println("finally is begin");
     return 2 ;
}

在b代码中输出结果跟a是一样的,然而返回的是return 2 ; 原因很明显,就是执行了finally后已经return了,所以catch里面的return不会被执行到。也就是说finally永远都会在catch的return前被执行。(这个是面试经常问到的问题哦!)

特别注意:

       catch(Excetion e){}这种结构是用来处理,try代码块中抛出的异常的,可以有很多的catch代码块,不过要注意的是,当有很多catch代码块,并且catch里面的参数有父子关系的时候,catch里面的参数一定要是子类在前面,父类在后面,因为按catch代码块出现的先后顺序匹配抛出的异常,一旦抛出的异常是哪个catch里面参数的子类或同类,那么就可以被这个catch代码块进行处理,那么其他的catch代码块就算也符合这种条件也不在进行处理了,如果有finally代码块的话就直接进入finally代码块中,没得则直接运行catch代码块后面的代码了。

    finally代码块是异常处理中一定会执行的代码块,就算没得异常也会执行,有异常则进入catch代码块中处理后,在进入finally中处理。

    在这里要注意一点,假如在try代码块中有return 语句,那么也是先执行finally里面的代码块后在执行return语句的。

 还需注意一点的是,函数的返回值,是最后活动栈的栈顶的值。如果try进行return了,那么在finally中我也进行return,那么finally代码块里面的return的值在栈顶,所以会返回finally中return的值。有如下测试代码。


6、对于异常的捕获不应该觉得方便而将几个异常合成一个Exception进行捕获,比如有IO的异常跟SQL的异常,这样完全不同的两个异常应该分开处理!而且在catch里处理异常的时候不要简单的e.printStackTrace(),而是应该进行详细的处理。比如进行console打印详情或者进行日志记录。

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

名词解释: 

1、检查性异常: 不处理编译不能通过 

2、非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台

3、运行时异常: 就是非检查性异常 

4、非运行时异常: 就是检查性异常

异常使用可遵循下面的原则: 

1:在当前方法被覆盖时,覆盖他的方法必须抛出相同的异常或异常的子类; 

2:在当前方法声明中使用try-catch语句捕获异常; 

3:如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。

   

异常方法

下面的列表是 Throwable 类的主要方法:

序号

方法及说明

1

public String getMessage()

返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。

2

public Throwable getCause()

返回一个Throwable 对象代表异常原因。

3

public String toString()

使用getMessage()的结果返回类的串级名字。

4

public void printStackTrace()

打印toString()结果和栈层次到System.err,即错误输出流。

5

public StackTraceElement [] getStackTrace()

返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

6

public Throwable fillInStackTrace()

用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。


java抛出异常的方法有很多,其中最常用的两个:

System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常,不过它和另外一个e.printStackTrace()方法不同。后者也是打印出异常,但是它还将显示出更深的调用信息。

比如说:

A   extends --->   B   extends  ----> C

当在创建A的过程中出现问题了,我们抛出异常。

System.out.println(e),除了标准异常外,只打印at A 然后再向外层层输出。

e.printStackTrace(),除了标准异常外,打印 

at   C

at   B

at   A

.......再向外层调查。 

在向外层调查的情况下,都一样。最后都会回到com.sun.midp.main.Main.main

Java中的getMessage()与printStackTrace():

1.getMessage()

getMessage()是用来获取异常中的异常错误消息字符串,但不返回异常错误的类型,这是用来获得错误信息的一个函数。

2.printStackTrace()

printStackTrace()这个方法会将Throwable对象的栈轨迹信息打印到标准错误输出流上,即产生异常的地方都会被打印到标准错误输出流,不过往往错误是由其中某一个带来的连续反应。