Java中异常、异常的处理方法及注意事项

Throwable 类是 Java 语言中所有错误或异常的超类
包括了Error类与Exception类


Throwable的常用方法:

String getMessage()

返回此 throwable 的详细消息字符串。

void printStackTrace()

将此 throwable 及其追踪输出至标准错误流。

String toString()
返回此 throwable 的简短描述。  

Error(错误)

表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。

Exception(违例)

表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。

什么是向上层抛出异常

告诉调用者这个方法有异常,需要注意或者进行处理。

可以选择三种方法来进行异常处理

1对代码块用try..catch进行异常捕获处理;

单个异常的处理
try {
        这里写可能出错的代码               
         } catch (Exception e) {
                        这里写可能出现的错误异常的处理
         }finally{
                        这里写一定会执行的代码,有些资源需要关闭的时候
         }
多个异常的处理
try{
        可能出现问题的代码

          
     }catch(异常类名1 对象名1){
          //异常处理
      }catch(异常类名2 对象名2(){
 
          //异常处理
        }
Jdk7以后出现另一种方式处理多个异常     
try{
          可能出现问题的代码;
    }catch(异常类名1 | 异常类名2 |... 对象名){
 
          处理异常
    }
try {
            System.out.println(a/b);
            System.out.println(arr[3]);
    }catch(ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("程序出问题了...");
    }
标准格式:
try {
            String strDate = "2018-6-20" ;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
            //解析
            Date d = sdf.parse(strDate) ; //
            System.out.println(d);            
     }catch(ParseException e) {  //创建一个异常对象:PareException e = new ParseException() ;
            //使用throwable里面的一些方法
            String str = e.getMessage() ;
            System.out.println(str);//Unparseable date: "2018-6-20"            
            String str = e.toString() ;//简单描述
            System.out.println(str);//包名.类名: getMessage() ;
            e.printStackTrace();
     }
finally{
      //里面的代码一定会被执行,除非jvm退出了      
}
关于return在finally中的用法会单独说明 (点击查看return在try catch语句中的用法)

2在该代码的方法体外用throws(表示可能出现的异常)进行抛出声明,告知此方法的调用者这段代码可能会出现这些异常,你需要谨慎处理。此时有两种情况:

如果声明抛出的异常是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。
如果声明抛出的异常是运行时异常,此方法的调用者可以选择地进行异常捕获处理。

也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间逗号开
xxx    返回值  方法名() throws  异常类名{}
例如:
public void show() throws IoException,ClassNotFoundException{...}

3在代码块用throw手动抛出一个异常对象,此时也有两种情况,跟2)中的类似:

如果抛出的异常对象是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常(使用throws)。
如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。(如果最终将异常抛给main方法,则相当于交给jvm自动处理,此时jvm会简单地打印异常信息)
例如:
private static void method2() throws Exception {
        int a = 10 ;
        int b = 0  ;
        
        if(b==0) {
            throw new Exception("产生异常:除数不能为零");      //控制台输出结果:java.lang.Exception: 产生异常:除数不能为零。。。
        }else {
            System.out.println(a/b);
        }
    }

如何自定义异常类

两种方式
1)自定义一个类,这个继承自Exception
2)继承RuntimeException

            通常调用一下父类的构造方法。
例如
public class MyException extends Exception {

    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message) ;
    }

异常中的注意事项:

1、运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。如果没有异常抛出,执行完try块,也要去执行finally块的代码。 然后执行finally块后面的语句        

2、throw 是语句抛出一个异常;throws 是方法抛出一个异常;
3、throws 可以单独使用,但 throw 不能;
4、throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

子类继承父类的时候的注意事项

1)子类重写父类的方法的时候,子类的方法的抛出的异常必须要么是父类的方法异常一样,要么是父类方法异常的子类
2)子类重写父类方法的时候,如果父类中的这个方法没有抛出异常,那么子类重写的这个方法也不能抛出异常,只能try...catch


常处理和设计的建议

1、只在必要使用异常的地方才使用异常,不要用异常去控制程序的流程
2、切忌使用空catch块
3、检查异常和非检查异常的选择
4、注意catch块的顺序
5、不要将提供给用户看的信息放在异常信息里
6、避免多次在日志信息中记录同一个异常
7、异常处理尽量放在高层进行
8、在finally中释放资源

猜你喜欢

转载自blog.csdn.net/scbiaosdo/article/details/80342511