异常处理
文章目录
简介
开发中的错误
在开发 Java 程序的过程中,会遇到各种各样的错误:
- 语法错误
会导致编译失败,程序无法正常运行 - 逻辑错误
比如需要执行加法操作时,不小心写成了减法操作 - 运行时错误
在程序运行过程中产生的意外,会导致程序终止运行
在 Java 中也叫做异常
程序产生了异常,一般称之为:抛出了异常 - 如果没有主动去处理它,会导致程序终止运行
例:如果【代码2】抛出了异常,并且没有主动去处理它,程序就会退出,【代码3】将没有机会执行。
pubilc staic void main(String[] args) {
【代码1】
【代码2】
【代码3】
}
思考:下面代码的打印结果是什么?
public static void main(String[] args) {
System.out.println(1);
Integer i1 = new Integer("123");
System.out.println(2);
Integer i2 = new Integer("abc");
System.out.println(3);
}
由于 "abc"
无法转换成整数,new Integer("abc")
会抛出一个异常:
- 异常类型:
java.lang.NumberFormatException
- 由于没有主动去处理这个异常,所以导致程序终止运行
思考:下面代码的打印结果是什么?
public static void main(String[] args) {
System.out.println(1);
Integer i = new Integer("1234");
Object obj = "1/2.34";
Double d = (Double)obj;
System.out.println(2);
}
由于 "12.34"
无法强转成 Double
类型,(Double)Object
会抛出一个异常
- 异常类型:
java.lang.ClassCastException
- 由于没有主动去处理这个异常,所以导致程序终止运行
思考:下面代码的打印结果是什么?
public static void main(String[] args) {
Integer[] nums = {
11, null, 22 };
for (int num : nums) {
System.out.println(num);
}
}
Integer
在自动拆箱为 int
时,会调用 Integer
对象的 inValue()
方法;
由于 nums[1]
为 null
,使用 null
调用方法会抛出一个异常
- 异常类型:
java.lang.NullPointerException
- 由于没有主动去处理这个异常,所以导致程序终止运行
上面抛出异常的代码建议这么写:
Integer[] nums= {
11, null, 22 };
for (Integer num : nums) {
System.out.println(num);
}
打印的细节:
Java 中直接打印 null 会报错,但是有时候确实可以把 null 打印出来:
public class Dog {
@Override
public String toString() {
return "Dog - 666";
}
}
Dog dog = new Dog();
System.out.println(dog); // Doge - 666
Dog dog2 = null;
System.out.println(dog2); // null
为什么 null 能被打印出来呢?可以看一下 println
的底层实现:发现调用了 String.valueOf
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
再看看 String.valueOf
:可以发现打印出 null 其实是经过处理的
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
异常
Java 中有各种各样的异常
- 所有的异常最终都继承自
java.lang.Throwable
如何防止程序因为抛出异常导致终止运行?
- 可以通过
try-catch
来捕捉处理异常
检查型、非检查型异常
检查型异常(Checked Exception)
- 这类异常一般难以避免,编译器会进行检查
如果开发者没有处理这类异常,编译器将会报错 - 哪些异常是检查型异常?
除Erro