Java 异常处理
Posted isguoqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 异常处理相关的知识,希望对你有一定的参考价值。
当程序出现错误,程序可以安全退出。
1. 异常的概念
Java采用面向对象的方式来处理异常,处理过程(每个异常都是一个对象):
- 抛出异常:在执行一个方法时,如果遇到异常,则这个方法生成代表该异常的一个对象,停止当前执行,将异常对象抛出给JRE
- 捕获异常:JRE得到该异常后,寻找相关的代码处理异常,JRE在方法的调用栈中,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
2. 异常的分类
所有异常的根类:java.lang.Throwable (类)
Throwable:
a、Error类:JVM已经处于不可恢复的崩溃状态,遇到重启虚拟机
b、Exception类:程序员处理,分为:
1. Checked Exception:编译器处理
2. Runtime Exception:运行时候抛出(Unchecked Exception)
3. RuntimeException
需要程序员检查和处理,使用逻辑处理来避免此类异常
NullPointerException: 对象为空,调用了其属性和方法
ClassCastException: 强制转型错误
ArrayIndexOutOfBoundsException:
NumberFormatException: 使用包装类将字符串转为基本类型的数据类型时
……
4. CheckedException 已检查异常
编译器报错
两种方式:try/catch 和 throw
4.1 捕获异常:
try
//语句1 , 如果遇到异常,创建异常对象,进行抛出,语句2不执行了,找到对应的catch,最后执行finally
//语句2
catch (Exception1 e)
//TODO
catch (Exception2 e)
// TODO
finally
// 不管有没有异常,finally都要最后执行
// finally只能有一条
// finally语句块只有一种情况不回执行,即执行finally之前遇到了System.exit(0)结束程序运行。
//使用try/catch捕获异常
FileReader reader = null;
try
reader = new FileReader("/a.txt");
char c1 = (char) reader.read();
System.out.println(c1);
catch (FileNotFoundException e) // FileNotFoundException 是 IOException,写catch时候,子类写在父类前面,否则全部会被父类捕获
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
finally
// 无论有无异常,都需要关闭reader
try
if (reader != null)
reader.close();
catch (IOException e)
e.printStackTrace();
4.2 throws
将异常抛出给调用者处理
public static void main(String[] args) throws IOException // main 方法抛给JRE
readMyFile();
public static void readMyFile() throws IOException // 将异常抛给调用者, 层层抛出
FileReader reader = null;
try
reader = new FileReader("/a.txt");
char c1 = (char) reader.read();
System.out.println(c1);
catch (FileNotFoundException e) // FileNotFoundException 是 IOException,写catch时候,子类写在父类前面,否则全部会被父类捕获
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
finally
// 无论有无异常,都需要关闭reader
try
if (reader != null)
reader.close();
catch (IOException e)
e.printStackTrace();
5. 自定义异常
继承CheckedException/RuntimeException
class Person
private int age;
public int getAge()
return age;
public void setAge(int age)
if (age < 0)
throw new IllegalAgeException("年龄不能为负数")
class IlegalAgeException extend RuntimeException
public IlegalAgeException()
public IlegalAgeException(String msg)
super(msg);
TIPs:
不要小粒度的使用异常,统一功能块放在一起,一般抛给调用者处理,有高层处理。
以上是关于Java 异常处理的主要内容,如果未能解决你的问题,请参考以下文章