关键知识点及补充
- 出现异常如果不解决,程序无法继续向下执行
- 平时我们遇到的异常看书写格式,很明显,都是类,java源码中在会出现异常的地方,都会有 throw new 异常类(); 也就是创建了异常,阻断了我们的编译,或着运行
- 我们也可以模仿异常的来创建自己的异常来判断阻断,异常都是继承自Exception|RuntimeException,编译时|运行时异常
- 增强程序健壮性只能解决程序的运行时异常
- throw制造异常 |throws 抛出异常 |try{ } catch(声明异常 ){ } finally{} 捕获异常 finally不管有没有异常都会执行的代码,catch可以有多个用于捕获多个异常,大范围的异常放在后面.不然后面的小捕获就是不可达语句
-
catch (Exception e){
System.out.println("接盘侠出现了..."); //可以捕获所有的异常,放在最后面,接盘侠啊
}
- 对于try catch 而言,try中放置的是可能发生的异常,当真正发生异常时候,执行对应异常的catch内容,try后面的内容都阻断了,不会发生
异常
* 异常: exception
* Throwable
* / \
* Error Exception
* | / \
* UnChecked Checked Runtime
* Exception Exception Exception
* 异常分为编译时异常和运行时异常
* Error: 一般是由虚拟机生成并脱出的,程序员不关注
* Exception : 异常,一旦出现异常,如果不解决,程序无法继续向下执行
* 检查时异常|编译时异常:编译期出现的异常,如果不处理,程序无法运行
* 运行时异常: 出现在程序运行期间,可以通过程序的健壮性处理
*
* 常见的运行时异常:
* 1.类型转换异常
* 2.空指针异常
* 3.数组索引越界异常
* 4.数组长度负数异常
* 5.数学异常 ArithmeticException
* 6.转换异常 NumberFormatException
异常处理
* throw : 制造异常
* 处理异常的方式: *********
* throws : 抛出异常
* try..catch :捕获异常
* try {
可能会出现异常的代码;
} catch (FileNotFoundException e) {
如果出现这个异常会执行的代码;
e.printStackTrace(); //打印异常的栈信息,标红色的打印异常信息
} catch (NullPointerException e){
如果出现这个异常会执行的代码;
}.....
finally{
无论是否出现异常,都会执行finally中的代码
}
如果一旦try中出现异常了,try中后面的代码都不会执行了
一个try后面可以跟一个或者多个catch
如果多个catch,大范围的在后面
自定义异常
* 不是java提供的异常类,根据自己的逻辑业务进行定义,合理的地方使用,注意要直接或者间接继承异常Exception
public class DefinedException01 {
public static void main(String[] args) {
Person p = new Person();
p.setName("yinwei");
try {
p.setAge(200);
} catch (AgeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(p);
}
}
//自定义异常类
//直接或者间接的继承自Exception
//运行时异常必须直接或者间接继承自RuntimeException
//当出现年龄不合法问题(<0||>150),会抛出这个异常
//创建一个异常类名字叫年龄异常,继承Exception
class AgeException extends Exception{
public AgeException() { //这是异常类的一个空构造
super();
}
public AgeException(String s) { //这是利用父类的异常处理机制返回一个字符串提示错误信息
super(s);
}
}
class Person { //定义一个类
private String name; //类的参数
private int age; //类的参数
public Person() { //空构造方法
// TODO Auto-generated constructor stub
}
public Person(String name, int age) { //类的全参构造
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException{ //设计异常
if(age<0 || age>150){
//也可以是throw new AgeException(); 这样就不会有异常提示信息
throw new AgeException("有异常了,这里是异常的提示信息");
}
this.age = age;
}
//重写toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
运行结果: //可以看出来,没有赋值成功,并且向下运行了 ,因为捕获处理了异常
com.shsxt.exception01.AgeException: 有异常了,这里是异常的提示信息
at com.shsxt.exception01.Person.setAge(DefinedException01.java:70)
at com.shsxt.exception01.DefinedException01.main(DefinedException01.java:16)
Person [name=yinwei, age=0]