java异常捕获

1.异常捕获的例子

String str = null;
    try {
        if (str.equals("abc")) System.out.println("equal!");
        str = "ac";
        System.out.println("后面的程序不执行了!");
    } catch (NullPointerException e) {
        str = new String("bac");
        if (str.equals("abc")) System.out.println("unequal");
        else System.out.println("equal");
    }

    System.out.println(str);
    System.out.println("代码还需要执行!");
}

nullpointerException是运行时的异常,如果不进行捕获的话,那么在第一句的时候变会直接终止程序。可是利用了捕获的话,可以继续运行,从而相对增加了程序的健壮性,程序避免瘫痪。

2.何时用try..catch?

当你觉得你的代码会出现异常的时候,你就可以用try。。catch,因此try。。catch可以针对你写的任何的代码,只要你觉得可能出现异常的。然后增加异常的处理,提高代码的健壮性。

3.JAVA中可以捕获运行时异常吗?

由于运行时的异常也是属于throwable的子类,因此也是可以被捕获的。但是一般不推荐捕获运行时候的异常,因此这个时因为逻辑错误导致的,属于应该解决的bug,但是捕获运行时候的异常,一方面是为了减少程序运行直接crash的次数,另外一方面通过捕获了运行时的异常之后,进行一些描述,来增加用户的体验。

运行时异常:我们可以不处理,因为运行时异常不需要显式抛出。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一

4.exception分类

异常分三种:Exception级别,这属于检查异常,必须要捕获,在编译时就会通知检查捕获。RuntimeException级别,这种属于运行时异常,它是在运行时被虚拟机捕获的异常,不必在代码中显示捕获。Error级别的异常,他属于虚拟机重大故障,不推荐它被捕获,它的出现必须让程序终止,通常它被抛给操作系统,它的出现一般是内存问题或者某种IO调用出现的虚拟机崩溃。

java捕获检查异常
  void someFun() throws IOException 
  { 
  if(condtion) 
  { 
  throw new IOException(); 

//throw new IllegalArgumentException(); 效果不同!
  } 
  }   

  IllegalArgumentException 是一个运行时异常,继承自RuntimeException 
  RuntimeException这种异常在程序正常运行时是不会发生的,因此这类异常不需要在程序中捕获 
  NullPointerException也属于这种异常 
  IOException 是非运行时异常,这类异常需要在程序中捕获 
  如果不捕获则需要将异常抛出,交给程序的上一层处理 
  我通常是这样写在方法名的后面,表示这个方法会抛出这个异常 

  非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

5.日志与异常

异常处理程序能做什么?要么把异常向上抛出中断当前程序的执行,要么自身消化掉不影响当前程序的运行。

不考虑异常继续抛出的情况,当此异常必须在本层被处理时,通常做法是捕获到异常后打印日志,并保持程序继续运行。

目前项目中用的比较多日志打印库是log4j,他将日志等级分为debug、info、warning、error,区别日志级别的原因是防止磁盘io和日志文件暴增,整个日志文件的级别设置在info级别。

在try catch中捕获的异常,通常通过error级别打印在日志文件中,方便后续排查问题。

针对项目的具体需求而言,并不是所有在try catch中捕获到的异常都应该设置在error级别,并且不是所有的错误都应该打出调用栈信息。

特别是与调用量相关的函数方法,当客户端调用触发大量异常时,对服务端而言大量捕获异常并打印日志会导致服务端磁盘io增多、日志文件而影响服务。

 

 

 

 

转载于:https://my.oschina.net/u/2984281/blog/786629

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值