作为初学者,每次看到一连串红色的英文报错提示是最崩溃的,特别是英语不好的同学会感觉无从下手,其实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();
}
}
之后将会慢慢补充完善。