package com.jmpower.javase.exception;
public class ExceptionTest01 {
public static void main(String[] args) {
int a=10;
int b=0;
int c=a/b;//实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/ by zero");
//并且JVM将new的异常对象抛出,打印输出信息到控制台了。
System.out.println(a+"/"+b+"="+c);
//观察到异常,对程序进行修改,更加健壮
}
}
2.异常存在的形式
package com.jmpower.javase.exception;
public class ExceptionTest02 {
public static void main(String[] args) {
//通过"异常类"实例化"异常对象"
NumberFormatException nfe=new NumberFormatException("数字格式化异常!");
//java.lang.NumberFormatException: 数字格式化异常!
System.out.println(nfe);
//通过"异常类"创建"异常对象"
NullPointerException npe=new NullPointerException("空指针异常!");
//java.lang.NullPointerException: 空指针异常
System.out.println(npe);
}
}
3.异常的继承结构
异常在Java中以类和对象的形式存在。那异常的继承结构是怎么样的?
Object
Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常。(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常)
RunTimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管)
1)概念:
编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。编译时异常因为什么而得名?
因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。
2)区别:
编译时异常一般发生的概率比较高。
举个例子:
你看到外面下雨了,倾盆大雨的。
你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。
而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。
"拿一把伞"就是对"生病异常"发生之前的一种处理方式。
对于一些发生概率较高的异常,需要在运行之前对其进行预处理。
运行时异常一般发生的概率比较低。
举个例子:
小明走在大街上,可能会被天上的飞机轮子砸到。
被飞机轮子砸到也算一种异常。
但是这种异常发生概率较低。
在出门之前你没必要提前对这种发生概率较低的一场进行预处理。
如果你预处理这种异常,你将活的很累。
假设java中没有对异常进行划分,没有分为: 编译时异常和运行时异常,所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?
首先,如果这样的话,程序肯定是绝对安全的。
但是程序员编写程序太累,代码到处都是处理异常的代码。
受检异常:CheckedException
受控异常:
未受检异常:UnCheckedException
非受控异常:
第一种方式:在方法是声明的位置上,使用throws关键字。
谁调用我,我就抛给谁,抛给上一级。
第二种方式:使用try…catch语句进行异常的捕捉。
这件事发生了,谁也不知道,因为我给抓住了。
举个例子:
我是某集团的一个销售员,因为我的失误,导致公司损失了1000元。
"损失1000元"这可以看作是一个异常发生了。我有两种处理方式,
第一种方式:我把这件事告诉我的领导【异常上抛】
第二种方式:我自己掏腰包把这个钱补上。【异常捕捉】
张三–>李四–>王五–>CEO
思考:异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种方式。
注意:java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。
8.运行时异常编写程序时可以不处理package com.jmpower.javase.exception;
public class ExceptionTest03 {
public static void main(String[] args) {
System.out.println(100/0);
//这里的Hello World没有输出,没有执行。
System.out.println("Hello World!");
}
}



