黑马程序员——异常
来源:互联网 发布:屏幕测试软件 编辑:程序博客网 时间:2024/05/03 07:38
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常
概念
阻止当前方法或者作用域继续执行的问题。
异常结构图:
1Throwable有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
1.1Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。
1.2Exception(异常):是程序本身可以处理的异常。常见的异常有:NullPointerException(空引用)、ArrayIndexOutOfBoundException(数组越界)。
运行时异常
都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
非运行时异常
是 RuntimeException以外的异常,类型上都属于Exception类及其子类,这类异常必须进行处理,不处理,程序编译不能通过。
异常和错误的区别:
异常能被程序本身可以处理,错误是无法处理。
异常的处理机制
1.抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处
置异常的代码并执行(方法中抛出都必须使用throws字句)。
1throws抛出异常:如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。
示例:抛出除数为0的异常
package ExceptionDemo1;class Div{ int div(int a, int b) throws Exception { return a / b; }}public class ExceptionDemo2{ public static void main(String[] args) throws Exception { Div d = new Div(); int x = d.div(4, 0); System.out.println("X = " + x); }}
Throws抛出规则
1如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
2必须声明方法可抛出的任何可查异常(checked exception)。
3仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。
4调用方法必须遵循任何可查异常的处理和声明规则。
2throw抛出异常:throw总是出现在函数体中,用来抛出一个Throwable类型的异常。
示例:抛出除数为0的RuntimeException异常。
package ExceptionDemo1;class Div{ int div(int a, int b) throws Exception { return a / b; }}public class ExceptionDemo2{2捕获异常 public static void main(String[] args) throws Exception { Div d = new Div(); try { int x = d.div(4, 0); System.out.println("X = " + x); } catch (Exception e) { throw new RuntimeException("除数不能为0"); } }}在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)用try、catch和finally语句捕获异常,异常总是先有地方抛出,才能捕获。
try-catch-fina语句格式
try
{
//可能发生异常的程序代码。
}
catch(异常类型1)
{
//捕获并处置try抛出的异常类型1
}
catch(异常类型2)
{
//捕获并处置try抛出的异常类型2
}
finally
{
//无论try出现异常还是不会出现异常程序一定会处理的的代码
//1在finally语句块中发生了异常。
//2在前面的代码中用了System.exit()退出程序。
//3程序所在的线程死亡。
//4关闭CPU。
}
try块:用于捕获异常
catch块:用于处理try捕获的异常。
finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。
示例:捕捉除数为0
package ExceptionDemo1;class Div{ int div(int a, int b) throws Exception { return a / b; }}public class ExceptionDemo1{ public static void main(String[] args) { Div d = new Div(); try { int x = d.div(4, 0); System.out.println("X = " + x); } catch (Exception e) { System.out.println(e.toString()); } finally { } }}
2Throwable类中的常用方法
1.getCause():返回抛出异常的原因。
2.getMeage():返回异常的消息信息。
3.printStackTrace():对象的堆栈跟踪输出至错误输出流。
3常见的异常类
1、RuntimeException子类
1.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出(开发中经常出现)。
2.ArithmeticException:术条件异常。譬如:整数除零等。
3.ClassNotFoundException:找不到类异常。
4.NegativeArraySizeException:数组长度为负异常。
5.ArrayStoreException:数组中包含不兼容的值抛出的异常。
6.SecurityException:安全性异常。
7.IllegalArgumentException:非法参数异常。
2、IOException()
1.IOException:操作输入流和输出流时可能出现的异常。
2.EOFException:文件已结束异常。
3.FileNotFoundException:文件未找到异常。
3、其他异常
1.ClassCastException:类型转换异常类(开发中经常出现)。
2.ArrayStoreException:数组中包含不兼容的值抛出的异常。
3.SQLException:操作数据库异常类。
4.NoSuchFieldException:字段未找到异常。
5.NoSuchMethodException:方法未找到抛出的异常。
6.NumberFormatException:字符串转换为数字抛出的异常。
7.StringIndexOutOfBoundsException:字符串索引超出范围抛出的异常(开发中经常出现)。
8.IllegalAccessException:不允许访问某类异常。
9.InstantiationException:当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。
4自定义异常
步骤:
1.创建自定义异常类。
2.在方法中通过throw关键字抛出异常。
3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4.在出现异常方法的调用者中捕获并处理异常。
示例:抛出除数为0的MyException异常。
package ExceptionDemo1;class MyException extends Exception{ public MyException(String msg) { super(msg); }}class Div{ int div(int a, int b) throws MyException { return a / b; }}public class ExceptionDemo3{ public static void main(String[] args)throws MyException { Div d = new Div(); try { int x = d.div(4, 0); System.out.println("X = " + x); } catch (Exception e) { throw new MyException("除数不能为0"); } }}
0 0
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员—异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- 黑马程序员——异常
- PKI与数字证书
- 把iOS的UIImage转为cocos2dx中可用的图片数据
- 突击Mercurial SCM(HG)7---not trusting file /opt/tortoisehg/.hg/hgrc
- <数据结构与算法分析 C++描述> 表/栈/队列
- 手机短信验证码,向前向后推30天,停3秒后跳转页面 java
- 黑马程序员——异常
- linux ----消息队列(ftok,msgget,msgsnd,msgrcv,msgctl)
- java策略模式
- gestureRecognizer
- 黑马程序员——反射机制
- 在 Hibernate做 项目遇到外键保存对象的问题
- 黑马程序员——多线程
- 在Maven中如何配置外部Jar
- C#中的多线程问题