java异常捕获

1.异常捕获的例子java

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能够针对你写的任何的代码,只要你以为可能出现异常的。而后增长异常的处理,提升代码的健壮性。debug

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增多、日志文件而影响服务。