1. Java异常体系
Java异常体系.pngThrowable
Throwable是整个异常体系的顶层父类,它有两个子类,分别是Error和Exception
Error
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止
Exception
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常
Exception又分为RuntimeException(运行时异常)和受检查的异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常属于unchecked异常,开发人员可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
除了java.lang.RuntimeException 和 java.lang.Error 类及其子类是 unchecked exception,其余的就是 checked exception 了。受检查的异常的特点就是当你调用了抛出这些异常的方法后,必须要处理这些异常。如果不处理,程序就不能编译通过。如:IOException、SQLException、用户自定义的Exception异常等。
2. 如何处理异常
Java中的异常处理都是围绕着 try-catch-finally, throw, throws 这几个展开的
- try-catch-finally:捕获异常并处理。
- throw:遇到错误的时候抛出一个异常。
- throws:声明一个方法可能抛出的异常(所有可能抛出的异常都需要声明)。
我们来通过一段代码来说明
public class Main {
public static void main(String[] args) {
int a = 5 / 0;
System.out.println("Hello World!");
}
}
运行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)
Process finished with exit code 1
可以看出抛出了一个异常,并且程序停止了
增加一个try-catch语句
public class Main {
public static void main(String[] args) {
try {
int a = 5 / 0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
System.out.println("Hello World!");
}
}
执行结果
java.lang.ArithmeticException: / by zero
Hello World!
at Main.main(Main.java:6)
Process finished with exit code 0
程序正常执行了,输出的异常信息是我们在catch快中输出的
下面我们将这两段代码放在安卓中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a = 5 / 0;
}
结果是app直接崩溃
日志1.png
错误是Error级别的,并且是红色的比较明显
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
int a = 5 / 0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
结果是app正常运行
日志2.png
在error级别的日志中是看不到的,并且蓝色的,并没有红色那么明显
结论
通过try-catch语句,一定程序上减少了程序的崩溃率,但是这样也会带来一个弊端,就是隐藏了一些问题,因为这个问题,明显是程序逻辑的问题,应该更改程序逻辑,即判断除数不能为空
对于最常见的NPE问题,也是这样,判断对象是否为null,而不是盲目的去try-catch
3. Crash处理文章
美团外卖Android Crash治理之路
https://tech.meituan.com/waimai-android-crash.html
网友评论