Java异常入门
前言
该篇指针对入门,学习Java异常基本知识。
一、Java异常
1、抛出异常
1)程序发生异常,如非法运算、文件不存在、I/O流异常等。
2)封装异常对象,Java作为面向对象的高级语言,当遇到异常时,将关于异常的一些信息封装到对应的异常对象中。
3)停止当前执行路径,并将异常交给JRE。
2、捕获异常
1)JRE获得异常对象
2)寻找相应代码来处理异常,JRE在函数调用栈中进行回溯寻找,直到找到相应异常处理代码为止。
注:JRE就是通过程序抛出异常,JRE捕获异常来对异常进行一个完整处理。
3、异常类
这是异常类继承关系大致图。
只需了解Throwable类为开始,
1)Error,这一般是一些关于硬件的error。
2)Exception,主要认识的异常类,分为RuntimeException和CheckedException(其它要检测异常的统称)。
a、For RuntimeException
1)NULLException,一般用if来做一个判断对象是否为空来解决。
public static void main(String[] args) {
String str = null;
char[] chs;
if (str != null)
chs = str.toCharArray();
}
2)ClassCastException,强转类出错。通过instanceof来判断。
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>();
LinkedList<Integer> ll = null;
if(arr instanceof LinkedList)
ll = (LinkedList<Integer>)arr;
}
3)NumbeFormatException,通过正则表达式判断。
public static void main(String[] args) {
String str = "123ab";
Pattern p = Pattern.compile("^\\d+$");
Matcher m = p.matcher(str);
Integer i = 0;
if(m.matches())
i = Integer.parseInt(str);
}
b、For CheckedException
1)try…catch…
public void testCheckedException() {
FileReader reader = null;
try {
//文件可能找不到
reader = new FileReader("d:\\a.txt");
//读的时候可能出现I/O异常
char ch = (char) reader.read();
} catch (FileNotFoundException e) {//匹配文件找不到异常
e.printStackTrace();
} catch (IOException e) {//匹配I/O异常
e.printStackTrace();
} finally {//不管有没有exception,都要执行关闭文件,以便其它线程使用该文件。
if (reader != null) {//NULLException处理方法
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2)throws
public static void testThrowException() throws IOException {
FileReader reader = new FileReader("d:\\a.txt");
char ch = (char) reader.read();
if (reader != null) {
reader.close();
}
}
public static void main(String[] args) throws IOException {
testThrowException();
}
4、自定义异常
只需继承相应的异常类即可变成异常类,封装自己的异常信息。
package com.xhu.java;
public class DefineException {
//异常类的封装
static class IllegalAgeException extends Exception {
//异常类构造所必要的构造函数
public IllegalAgeException(String msg) {
super(msg);
}
}
//人物类,通过setAge的throws来控制未成年
static class Person {
int age;
public int getAge() {
return age;
}
public void setAge(int age) throws IllegalAgeException {
if (age < 18) {
throw new IllegalAgeException("未成年不能加入!");
}
this.age = age;
}
}
public static void main(String[] args) {
Person p = new Person();
//可try...cathch...,也可在main函数甩出异常,把异常交给JRE。
try {
p.setAge(17);
} catch (IllegalAgeException e) {
System.out.println(e.getMessage());
System.exit(0);
}
System.out.println("继续执行代码");
}
}