JAVA——异常及异常处理
来源:互联网 发布:数据分析师加班厉害吗 编辑:程序博客网 时间:2024/05/16 12:00
1.异常的概念
异常是指程序运行期间出现的错误,而非编译时的语法错误。例如,程序要打开不存在的文件夹、网络连接中断、操作数越界、装载一个不存在的类、算数异常等。
使用异常的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更加自信:你的应用没有未处理的错误。——《JAVA编程思想》如是说。
- 补充:
- 示例1:
public class TestException{ public static void main(String[] args) { int array[] = {1, 2, 3}; System.out.println("array[5]=" + array[5]); }}
- 编译,运行:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at TestException.main(TestException.java:6)
出现了“数组索引越界异常”,ArrayIndexOutOfBoundsException。在Java中,会严格检查数组的长度的,即在程序中,运行时不能出现数组越界的索引。
示例2:
public class TestException{ public static void main(String[] args) { int a = 2/0; }}
- 编译,运行:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionException in thread "main" java.lang.ArithmeticException: / by zero at TestException.main(TestException.java:5)
出现了算数异常。运行打印出的异常信息就是“错误的堆栈信息”。
错误堆栈信息:此错误可能是上一个错误导致的,上一个错误又可能是另外一个错误引起的,到底是由哪一个错误引起的,把这些错误信息都打印出来,为程序员提供了调试信息,方便程序员进行错误追踪和调试。
2.异常的分类
3.捕获异常及处理
3.0异常处理
- 补充:对于RuntimeException类的子类exception,我们可以也可以不使用try-catch语句来捕获异常。对于除了RuntimeException类的子类exception之外的exception,我们都必须需要使用try-catch语句来捕获异常,例如ArrayIndexOutOfBoundsException异常类。
- 对于异常,当前环境没有足够的信息来解决这个问题,所以就把这个问题提交到一个更高级别的环境中,一直到main()方法,在这里将作出正确的决定。
3.1 调用抛出异常的方法使用try{}catch(){}语句
- try{}catch(){}语句:当try代码中的程序发生了异常,系统将这个异常发生的代码行号、类别信息封装到一个对象e中,并将这个对象传递给catch代码块。
每个try语句必须有一个或多个catch语句,try代码块与catch代码块及finally代码块之间不能有其他语句存在。
finally语句
(1)在try-catch语句后,还可以有一个finally语句,finally语句中的代码不管是异常是否被捕获总是要执行的。
(2)finally中的代码块不能被执行的唯一情况是:在被保护代码块执行了System.exit(0);语句。
(3)finally语句的其他用法参见:《Java编程思想》第12.8节,或者我的下一篇博文:JAVA——finally块中的代码什么时候被执行、执行的效果是什么?。- 示例3:
import java.io.*;public class TestException{ public static void main(String[] args) { FileInputStream fis = null; fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");/*myfile.txt里面的内容是hello world!*/ int b = fis.read(); while(b != -1) { System.out.println((char)b); b = fis.read(); } fis.close(); }}
- 编译,运行:可以发现,存在异常没有进行捕获和处理(抛出)。
D:\JavaProject\demo14>javac TestException.javaTestException.java:7: 错误: 未报告的异常错误FileNotFoundException; 必须对其进行捕获或声明以便抛出 fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt"); ^TestException.java:8: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出 int b = fis.read(); ^TestException.java:12: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出 b = fis.read(); ^TestException.java:14: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出 fis.close(); ^4 个错误
- 查看jdk文档:
(1)FileInputStream类有三个构造方法,此处调用的构造方法如下图,可以看到该构造方法抛出了一种没找到目标文件的异常类。因此,我们在调用该方法时,必须要使用try-catch语句进行捕获异常。 - 若一个方法名后写明了throws时,调用该方法时必须使用try-catch语句进行捕获异常。当所抛出的异常类是RuntimeException的子类时,可以不对其进行try-catch。
方法close()和方法read()都会抛出异常:
示例4:
import java.io.*;public class TestException{ public static void main(String[] args) { FileInputStream fis = null; try{ fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt"); int b = fis.read(); while(b != -1){ System.out.print((char)b); b = fis.read(); } }catch (FileNotFoundException fe){ fe.printStackTrace(); }catch (IOException ioe){ ioe.printStackTrace(); }finally{ try{ fis.close(); }catch (IOException ioe){ ioe.printStackTrace(); } } }}
- 编译,运行:输出hello world!
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionhello world!
3.2 声明方法时抛出异常:throws SomeException
- 如果将“示例4”的部分代码写成一个方法:因为在这个func方法中,throws抛出了两个异常:FileNotFoundException 、 IOException。因此,我们在使用该方法时,就必须使用try-catch语句进行捕捉和处理。
- 在声明时,所抛出的异常是方法体中可能存在的所有异常类。而FileNotFoundException 是IOException的子类,所以在声明方法时,直接抛出IOException类异常即可。但是为了直观,程序的可读性,还是建议把所有可能的异常类均完整的写出来。
而在使用该方法时,FileNotFoundException 是IOException的子类,可以直接创建父类的异常对象IOException即可。
示例5:
import java.io.*;public class TestException{ public static void main(String[] args) { try{ TestException te = new TestException(); te.func(); }catch (IOException e){ e.printStackTrace(); } } void func() throws FileNotFoundException , IOException { FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt"); int b = fis.read(); while(b != -1){ System.out.print((char)b); b = fis.read(); } fis.close(); }}
- output:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionhello world!
- 当使用函数调用方法func()时,func抛出的异常不是Runtime异常,而是必须捕捉的异常,因此在调用时必须写try-catch,并进行处理。见示例6。
如果捕捉到这周异常后,也不知道怎么处理,那么继续将这些异常给抛出(在函数名后throws+要抛出的异常),这时直接调用它即可,不需要try-catch语句。只是抛出父类的异常IOException即可。见示例7。
示例6:
import java.io.*;public class TestException{ public static void main(String[] args) { TestException te = new TestException(); te.f(); } void func() throws FileNotFoundException , IOException { FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt"); int b = fis.read(); while(b != -1){ System.out.print((char)b); b = fis.read(); } fis.close(); } void f() { try{ func(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } }}
- 示例7:
import java.io.*;public class TestException{ public static void main(String[] args) { try{ TestException te = new TestException(); te.f(); }catch (IOException e){ e.printStackTrace(); } } void func() throws FileNotFoundException , IOException { FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt"); int b = fis.read(); while(b != -1){ System.out.print((char)b); b = fis.read(); } fis.close(); } void f() throws IOException{ func(); }}
3.3 手动的构造并抛出异常对象
- 遇到异常时,遇到throws时,可自动的往外抛出异常,我们不再去管它了。而还有一种异常,就必须自己手动的往外抛。
- 抛的格式:throw + 要抛出的异常对象。方法定义时,指明要抛出异常的类。
- 示例8:其中,可以指定异常信息,如”被除数为0“,利用getMassage()方法就可获得这个信息。当抛出new ArithmeticException(“被除数为0”);以后,这句后面的语句将不再执行。
void m(int i) throws ArithmeticException { if(i==0) throw new ArithmeticException("被除数为0"); }
4.使用自定义异常
-
- 注意:重写方法需要抛出与原方法所抛出异常类型一致的异常,或那些异常的字迹,或不抛出异常。
- JAVA——异常及异常处理
- ”戏“说java—异常及异常处理概述
- Java 异常及异常处理
- java异常及异常处理
- Java异常及异常处理
- Java异常及处理
- java异常及处理
- JAVA异常及处理
- java异常及处理
- Java异常处理及异常机制介绍
- JAVA异常处理及通过异常跳转
- Java异常处理及异常机制介绍
- Java异常处理及异常机制介绍
- Java异常机制及异常处理分析
- Java异常处理及异常机制介绍
- java--异常及异常的处理机制
- Java异常体系及异常处理
- Java中的异常及异常处理
- 程序运行时 线程
- CFileDialog、CColorDialog、CFontDialog三个类的使用说明
- html5第八课时,状态伪类选择器
- STL 中栈和队列的使用方法
- java内存特点
- JAVA——异常及异常处理
- P1422 小玉家的电费
- Myeclipse软件已经过期的破解法
- html5第八课时,关系选择器
- 第七周 CSS3 动画效果
- Android平台版本-API级别与版本号对照表
- HttpEntity的类型及其使用
- html5第八课时,属性前缀
- Android studio如何实现短信验证