Java把所有不正常情况分为两种,它们都继承Throwable父类
--错误:一般之虚拟机相关问题,如系统崩溃,虚拟机错误,动态连接失败等,这类情况不能恢复或不可能被捕获。
--异常:与错误相反,
主要依赖5个关键字:try、catch、finally、throw、throws’
1. 抛出Checked异常和Runtime异常的区别
- 不是RuntimeException类及其子类的实例被称为Checked异常
- Checked异常:要么使用throws显示的抛出,要么用try..catch显示的捕获它,并处理.
- Runtime异常: 无需显示的抛出,如果需要可以使用try..catch显示的捕获它
public class ExceptionDemo {
public static void main(String[] args) {
try {
//调用Checked异常方法,要么在main方法中再次抛出,要么显示的处理它
throwChecked(4);
} catch (Exception e) {
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法,既可以显示的捕获它,也可以不理会该异常
throwRunTime(4);
}
/*
* 自行抛出Exception异常
* 该代码必须在try块中,或者在带有throws声明的方法中
*/
public static void throwChecked(int a )throws Exception{
if (a>0){
throw new Exception("a的值大于0");
}
}
/*
* 自行抛出Runtime异常
* 可以完全不理会该异常,也可以交给该方法的调用者处理
*/
public static void throwRunTime(int a){
if (a>0) {
throw new RuntimeException("a的值大于0");
}
}
}
运行的结果:

2. 自定义异常类
/*
* 自定义异常类,提供两个构造器
* 如果希望是Runtime异常,则继承RuntimeException基类
*/
class AuctionException extends Exception {
public AuctionException() {
}
public AuctionException(String message) {
super(message);
}
}
3. catch和throw同时使用
企业级应用中通常对异常处理通常分为两个部分,一个是后台通过日志记录异常发生的详细情况,
另一个是根据异常向使用者(非开发者)传达某种提示。
public class ExceptionDemo2 {
private static double initPrice = 30.0;
public static void bid(String bidPrice) {
double d = 0.0;
try {
d = Double.parseDouble(bidPrice);
} catch (Exception e) {
//此处仅仅在控制台打印出异常
e.printStackTrace();
//再次抛出自定义异常
throw new RuntimeException("竞拍的价格必须是数值");
}
if (initPrice > d){
throw new RuntimeException("竞拍价不许比起拍价低");
}
}
public static void main(String[] args) {
try {
bid("abc");
} catch (Exception e) {
//再次捕获异常,并处理
System.err.print(e.getMessage());
}
}
}
结果:
