Java-异常

一、常见的异常操作
  在Java提供了大量的异常类,这些都来自于Java.lang.Throwable类。Throwable有两个直接子类,其中Error代表程序中产生的错误,Exception代表程序的产生的异常。
  1.Error
    该类成为错误类,是JVM错误,它表示Java运行时产生的系统内部错误,或者资源耗尽的情况。
    a.通过java运行一个不存在的类就会出现Error错误-即虚拟机无法找到-itcast这个类
    b.有时出现递归是,由于垃圾回收的原因,可能会出现内存耗尽的情况,即StackOverflowError,即栈空
  2.Exception
    该类成为异常类,它代表程序本身可以处理的错误,在开发Java程序中进行的异常处理。父类均为-Exception,在其众多子类中,有一个特殊的RuntimeException类,除此类外,Exception的其它所有子类,都用于表示编译时异常。
二、异常捕获
  程序出现异常,就会停止运行。java中提供一种对异常的处理方式-异常捕捉,通常使用try...catch语句。

  具体格式如下:

1 try{
2 //程序代码块
3 }catch(ExceptionType(Exception类即其子类)){
4 //对ExceptionType的处理
5 }

    其中try代码块中编写的可能发生异常的Java语句,catch代码块中编写针对异常进行处理的代码块

 1 public class example21 {
 2 
 3     public static int divide(int x,int y){
 4         int result=x/y;
 5         return result;
 6     }
 7     public static void main (String [] args){
 8         try{
 9             int result=divide(4,0);
10         }catch(Exception e){
11             System.out.println("捕捉的异常信息为"+e.getMessage());
12         }
13         System.out.println("程序继续向下运行......");
14     }
15 
16 }    

  程序的运行结果是: 
    捕捉的异常信息为/ by zero
    程序继续向下运行......
  这里我们可以得到两个信息,一个是,try{}catch(){}捕获到了异常,
  且将参数e传递给catch代码块;
  且try中的代码块捕获到了异常后,以后的代码块是不会继续运行的
  try{}catch()之后的代码块可以继续运行。

  try代码块中,一旦捕获到了异常,其后面的程序不会继续执行
  如果要程序是否发生异常都要继续执行,可以在try...catch语句后面加入一个finally代码块


 1 public class example22 {
 2 
 3     public static int divide(int x,int y){
 4         int result=x/y;
 5         return result;
 6     }
 7     public static void main (String [] args){
 8         try{
 9             int result=divide(4,0);
10         }catch(Exception e){
11             System.out.println("捕捉的异常信息为"+e.getMessage());
12             //return;
13         }finally{
14             System.out.println("进入finally语句块");
15         }
16         System.out.println("程序继续向下运行......");
17     }
18 
19 }    

  程序运行结果
  捕捉的异常信息为/ by zero
  进入finally语句块
  从结果可知,并没有执行System.out.println("捕捉的异常信息为"+e.getMessage());这一语句
  且没有执行System.out.println("程序继续向下运行......");代码块?
  在catch中加入return代码块后,会结束之前的方法,可是finally会继续执行
  如果要返回结果,不要在try...catch语句块中返回,否则下面的程序会执行不了
  可以把return注释后,发现finally代码块会继续运行
  try...catch语句执行 System.exit(0)时,finally语句块不会运行。
  System.exit(0)表示,退出当前的虚拟机。

三、throw关键词
  针对代码块无法判断是否会发生异常时,java中允许在方法的后面使用throws关键词对外申明
  该方法可能发生的异常
  throws关键词的抛出异常的语法格式为
    修饰符 返回值类型 方法名 ([参,参数2....])throws ExceptionType1,[,ExceptionType2...]
    我们发现 divide 会出现错误
    1.可以继续抛出错误--抛出不是处理
      继续使用throws抛出
      会执行代码System.out.println("进入代码...");
      而异常后面的代码不会执行
      抛出后不会执行以后的代码,程序会非正常停止

  2.可以用try...catch对错误进行处理
      使用代码块try...catch处理错误
      在try...catch代码块依旧可以运行

 1 public class example23 {
 2     //实现两个整数相除,并使用throws关键字声明抛出异常
 3     public static int divide(int x,int y)throws Exception{
 4         int result=x/y;
 5         return result;
 6     }
 7     public static void main (String [] args) {
 8              System.out.println("进入代码...");
 9             int result = 0;
10             try {
11                 result = divide(4,0);
12             } catch (Exception e) {
13                 // TODO Auto-generated catch block
14                 e.printStackTrace();//打印捕获的异常信息
15             }
16             System.out.println(result);
17             System.out.println("退出代码...");
18     }
19 
20 }    

四.Java的异常分类
  1.运行时异常--非检查异常
    RuntimeException类及其子类都是运行时异常。
    运行时异常的特点是Java编译器不会对其检查,
    即没有try..catch语句捕获或使用throws关键字声明抛出,程序也能正常编译通过
    常见的该类异常有: 越界--ArrayIndexOutBoundException
    空指针--NullPointterException

  2.编译时异常--检查异常
    除了RuntimeException类及其子类都是检查异常
    运行时异常的特点是Java编译器不会对其检查
    处理编译时期的异常有两种方式,
      a.使用try...catch语句对异常进行捕获;
      b.使用throws关键字声明抛出异常,调用者对其处理

五.异常信息分析
  在非检查异常时,可以配合异常信息和输出来处理

原文地址:https://www.cnblogs.com/tianliang94/p/10056195.html