异常:
Java中的异常指程序中的一些错误,但并不是所有的错误都是异常,因为有的错误是可以避免的。
例:当程序当中因为少写了一个分号,这个时候就会运行结果就会出现一个错误-Java.lang.Error;而当我们输出10/0是就会出现一个异常-java.lang.ArithmeticException,因为0不能作为被除数。
要理解Java中异常处理是如何工作的,我们就需要了解一下3种异常
- 检查性异常(IOException):通俗来说,检查性异常就是在编译时能够捕捉到的异常。例如打开不存在的文件等引发的异常。这些异常在程序编译时不会被简单地忽略。
- 运行时异常(RuntimeException):通俗来说,这种异常程序在编译时被忽略,而在程序运行时才会被捕捉到。例如,除数为0的算数异常ArithmeticException等等,这种异常是运行时发生,无法预先捕捉处理的。
- 错误(Error):错误不是异常,在程序中常常被忽略,例如当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
异常的分类:
- Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
- 错误和异常的区别是错误不能被处理,而异常可以被处理。
捕获异常:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
- Catch 语句包含要捕获异常类型的声明。
- try中的代码称为保护代码,当里面的代码出现一个异常,try 后面的 catch 块就会被检查。
实例:
package java_demo.异常;
public class Yic {
public static void main(String args[])
{
try
{
int temp[] = new int[2];
System.out.println(temp[3]);
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("出现异常:"+e);
}
}
}
结果:
小结:
- 面的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。
- 这是一个运行时异常,编译代码时无法捕获,运行时才能捕获。
声明自定义异常:
在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
实例:银行存取钱例子
InsufficientFundsException类
package java_demo.异常.自定义异常;
public class InsufficientFundsException extends Exception //自定义异常类
{
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double get_amount()
{
return amount;
}
}
CheckingAccount类
package java_demo.异常.自定义异常;
public class CheckingAccount
{
private int balance;
public void deposit(double amount) //存钱
{
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException //取钱
{
if(balance>=amount)
{
balance -= amount;
}
else
{
double need = amount - balance;
throw new InsufficientFundsException(need); //向上抛出异常
}
}
public double get_balance() //返回余额
{
return balance;
}
}
BankDemo类
package java_demo.异常.自定义异常;
public class BankDemo
{
public static void main(String args[])
{
System.out.println("存入500RMB!");
CheckingAccount a = new CheckingAccount();
a.deposit(500);
try { //捕获异常
System.out.println("取出600RMB!");
a.withdraw(600);
} catch (InsufficientFundsException e) {
System.out.println("余额缺少:"+e.get_amount());
e.printStackTrace();
}
}
}
结果
throws/throw 关键字:
- 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
- 也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。