异常处理
异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。
特点
1.在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。
2.发生异常时,控制流立即跳转到关联的异常处理程序(如果存在)。
3.如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息。
4.可能导致异常的操作通过 try 关键字来执行。
5.异常处理程序是在异常发生时执行的代码块。在 C# 中,catch 关键字用于定义异常处理程序。
6.程序可以使用 throw 关键字显式地引发异常。
7.异常对象包含有关错误的详细信息,其中包括调用堆栈的状态以及有关错误的文本说明。
8.即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。
**摘自百度百科**
Java异常的分为两大类
Checked exception
Unchecked exception (Runtime Exception)
Java 中所有的异常都直接或者间接的继承Exception
RuntimeException类也是直接继承Exception 它叫运行异常
Java中运行异常都直接或者间接的继承RuntimeException
Java 中凡是继承Exception 而不是继承RuntimeException都是非运行异常
常见的异常
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
举个栗子
举一个超级简单的例子
public class Main {
public static void main(String[] args) {
// write your code here
int a = 0;
int b = 3;
int c = 0;
c = b/a;
System.out.println(c);
}
}
由于不能处于0 上面的代码出现算术异常类:ArithmeticExecption
解决办法
1 用throws/throw抛出异常
2 利用Try{}catch(){}finally{}
对于非运行异常(Checked exception)必须要对其进行处理
处理的方法两种
1 try{
}catch(){
}finally{
}
2 在调用该会产生异常的方法所在的方法声明处进行thows Exception
对于运行异常 可以进行处理 也可以不处理 建议不处理
package com.company;
public class Main {
public static void main(String[] args) throws Exception {
// write your code here
int c = 0;
try {
int a = 0;
int b = 3;
c = b/a;
System.out.println("Hello ");
}catch (ArithmeticException e){ //捕获异常
System.out.println("Welcome 这里出现异常");
}finally{ //无论是否发生异常 finally里面的代码块都会执行
System.out.println(“Welcome”);
}
System.out.println(c);
}
}
出现的结果是 Welcome 这里出现异常
Welcome
0
try 里面的代码出现异常的时候 就会终止里面的代码直接跳到catch 里面的
并且 无论是否发生异常 finally里面的代码块都会执行
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
自定义异常
所谓自定义异常,通常就是定义了一个继承自 Exception 类的子类,那么这个类就是 一个自定义异常类。通常情况下,我们都会直接继承自 Exception 类,一般不会继承 某个运行时的异常类。
public class MyException extends Exception
{
public MyException()
{
super();
}
public MyException(String message)
{
super(message);
}
}
public class ExceptionTest4
{
public void method(String str) throws Exception
{
if(null == str)
{
throw new MyException("Ϊnull");
}
else if("hello".equals(str))
{
throw new MyException2("Ϊhello");
}
else
{
System.out.println(str);
}
}
public static void main(String[] args)
{
try
{
ExceptionTest4 test = new ExceptionTest4();
test.method("hello");
}
catch(MyException e)
{
System.out.println("MyException catch");
e.printStackTrace();
}
catch(MyException2 e)
{
System.out.println("MyException2 catch");
e.printStackTrace();
}
catch(Exception e)
{
System.out.println("Exception catch");
e.printStackTrace();
}
finally
{
System.out.println("hello");
}
System.out.println("bye");
}
}
public class MyException2 extends Exception
{
public MyException2()
{
super();
}
public MyException2(String message)
{
super(message);
}
}
我们可以使用多个 catch 块来捕获异常,这时需要将父类型的 catch 块放到子类型的 catch 块之后,这样才能保证后续的 catch 可能被执行,否则子类型的 catch 将永远 无法到达,Java 编译器会报编译错误;如果多个 catch 块的异常类型是独立的 (MyException, MyException2), 那么谁前谁后都是可以的。
如果 try 块中存在 return 语句,那么首先也需要将 finally 块中的代码执行完毕,然 后方法再返回。 如果 try 块中存在 System.exit(0)语句,那么就不会执行 finally 块中的代码,因为 System.exit(0)会终止当前运行的 Java 虚拟机,程序会在虚拟机终止前结束执行。