作为初学者,每次看到一连串红色的英文报错提示是最崩溃的,特别是英语不好的同学会感觉无从下手,其实Java的异常提示处理有一定的技巧,只要能正确理解错误提示,便可以轻松解决问题。

我们知道Java的异常分为编译时异常与运行期异常,编译时异常可以被我们用来做一些业务逻辑的处理,有时的出现是在我们控制范围内的,因此我们暂时不考虑这些异常,我们主要来研究一下在我们意料之外的那些运行时异常。

今天先列举一些常见的JavaSE异常,我会贴出异常名,出现原因,示例代码以及解决方案。我一个人列举的可能并不全面,也希望大家一起帮忙补充。

1、异常名:NullPointerException——空指针异常

出现原因:最常见的异常之一,是调用了为null的变量的方法。

示例代码:

public static void main(String[] args) {
    String string = null;
    string.charAt(0);
    
  }

报错信息

Exception in thread "main" java.lang.NullPointerException
  at test1.testNullPointer.main(testNullPointer.java:7)

可以看到很清楚,在第7行报了空指针异常,只要点击括号后的链接便可定位到错误的代码行。

解决方案:避免调用null对象的方法,或者进行空指针防护,只有在不等于null的情况下才调用方法。

2、异常名:ArithmeticException——运算异常

出现原因:这个异常出现的可能性较低,出现原因是一个数除以0,一般被用来人为制造异常。

示例代码:

public static void main(String[] args) {
    int i = 10/0;
    
  }

报错提示:

Exception in thread "main" java.lang.ArithmeticException: / by zero
  at test1.testNullPointer.main(testNullPointer.java:6)

解决方案:不要让0成为除数。

3、ArrayIndexOutOfBoundsException:数组索引越界

出现原因:调用了不存在的数组索引。

数组的索引一般从0开始,最大为数组长度-1,如果调用的不在范围内,就会抛出这个异常。

实例代码:

public static void main(String[] args) {
    int[] i = {1,3,5};
    System.out.println(i[3]);
  }

报错提示:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
  at test1.testNullPointer.main(testNullPointer.java:7)

解决方案:检查索引,确保索引在数组的索引范围内。

类似的异常:IndexOutOfBoundsException——集合索引越界

示例:

public static void main(String[] args) {
    List<Integer> i = new ArrayList<Integer>();
    System.out.println(i.get(1));
  }

报错提示:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
  at java.util.ArrayList.rangeCheck(Unknown Source)
  at java.util.ArrayList.get(Unknown Source)
  at test1.testNullPointer.main(testNullPointer.java:10)

遇到多行的提示,可以从首次出现自己建的包名的那一行进行定位,比如我的包名为test1,那就从第一次出现test1也就是第三行开始定位。

还有一个类似的:StringIndexOutOfBoundsException——字符串索引越界

示例:

public static void main(String[] args) {
    String str = "abc";
    str.charAt(5);
  }

报错提示:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
  at java.lang.String.charAt(Unknown Source)
  at test1.testNullPointer.main(testNullPointer.java:10)

解决方案同上。

4、ClassCastException:类转换异常

出现原因:多态向下转型或者是将小类型转化为大类型

示例:

public class Father {

}
public class Son extends Father{
  
}
public static void main(String[] args) {
    Father f = new Father();
    Son s = (Son) f;
  }

报错信息:

Exception in thread "main" java.lang.ClassCastException: test1.Father cannot be cast to test1.Son
  at test1.testNullPointer.main(testNullPointer.java:10)

解决方案:检查所有类型转换,避免将父类转化为子类,在类型转换时尽量慎重,避免由小转大。

5、NumberFormatException——数字格式化异常

出现原因:将数字以外的字符串转化为数字。

示例代码:

public static void main(String[] args) {
    String str = "abc";
    Integer.parseInt(str);
  }

报错提示:

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
  at java.lang.NumberFormatException.forInputString(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at test1.testNullPointer.main(testNullPointer.java:10)

解决方案:确保被转化的字符串为数字。

6、ConcurrentModificationException:并发修改异常

出现原因:使用foreach遍历集合时删除了集合的元素。

示例代码:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    for (Integer integer : list) {
      list.remove(integer);
    }
  }

报错提示:

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
  at java.util.ArrayList$Itr.next(Unknown Source)
  at test1.testNullPointer.main(testNullPointer.java:13)

解决方案:使用iterator操作集合

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    Iterator<Integer> iterator  = list.iterator();
    while (iterator.hasNext()) {
      Integer next = iterator.next();
         iterator.remove();
        }
  }

之后将会慢慢补充完善。