异常处理

异常处理

异常处理,英文名为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
RuntimeExceptio
n类也是直接继承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);
    }
}

算术异常类:ArithmeticExecption
由于不能处于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 虚拟机,程序会在虚拟机终止前结束执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值