认识java异常
异常是程序中的一些错误,但不是所有的错误都是异常,并且有时错误是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;
如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入非法数据
- 打开的文件不存在
- 网络通信时网络中断,或者JVM内存溢出
这里面有的是用户引起的,有的是程序错误引起的,还有的则是物理错误引起的!
要理解java异常是如何工作的,就必须如下三种异常:
- 检查性异常
- 运行时异常
- 错误
处理异常
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
多重捕获块
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
常见异常
- java.lang.NullPointerException(空指针异常)
调用了未经初始化的对象或者是不存在的对象
java.lang.ClassNotFoundException
指定的类不存在这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通 过字符串来加载某个类时可能引发 异常
java.lang.ClassCastException
数据类型转换异常当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常。
java.lang.IndexOutOfBoundsException
数组下标越界异常java.lang.NumberFormatException
字符串转换为数字异常当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。
但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理.java.lang.ArithmeticException
数学运算异常当算术运算中出现了除以零这样的运算就会出这样的异常。
throws关键字
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
自定义异常
在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
可以像下面这样定义自己的异常类:
class MyException extends Exception{
}
例子:
package com.lang.exception;
import javax.swing.plaf.metal.MetalScrollBarUI;
class MyException extends Exception {
public MyException(String msg) {
super(msg);
}
}
public class ExceptionDemo {
public static void main(String[] args) {
try {
throw new MyException("自定义异常");
} catch (Exception e) {
System.out.println(e); // 输出:com.lang.exception.MyException: 自定义异常
}
}
}