1. 可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常,由方法调用者来处理它。
a) 事实上,异常还有一个非常有用的作用,可以用它来做流程控制。
2.
在Java编程语言中,用try和catch语句来处理异常。格式如下:<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> </v:shapetype>
<v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>
try {
// code that might throw a particular exception
} catch (SpecialException e) {
// code to execute if a SpecialException is thrown
} catch (Exception e) {
//code to execute if a general Exception exception is thrown
}
---------------------------------------------------------------------------------------------------------------
关键字throws 指出方法有可能抛出的异常,如果方法有可能抛出多个异常,可以在throws后添加多个异常,声明抛出多个异常
例如:methodName throws Exception1,Exception2,Exception3
Throwable是所有异常类的父类,继承自Object类。Throwable又分为两种(Error,Exception,均继承自Throwable);
Error :用来表示编译时和系统错误
Exception : 可以抛出的基本类型
注意:
<1>声明异常的关键字是:throws; 抛出异常的关键字是: throw
<2>一个方法只能抛出在方法声明中声明的异常以及异常Error,RuntimeException和它们的子类。例如;如果没有在方法声明中声明IOException异常,那么在这个方法体中就不能抛出它。但是,即使方法没有声明RuntimeException或它的子类,方法也总能抛出它们。此外,java强迫程序员处理异常。如果一个方法声明了Error和RuntimeException之外的异常,则必须在调用它的地方用try语句中进行捕获和处理,以避免程序突然中止。
<3>如果try块中的某条语句抛出了一个异常,那么java就会略过其余语句,开始为该异常搜索异常处理器。如果异常的类型与某个catch子句所列的异常匹配,就会执行该catch语句子句中的代码,如果异常类型与任何一个catch子句中的异常都不匹配,那么就会跳过try块中的其它语句,执行finally子句,并退出这个方法,将异常传递给调用该方法的方法,继续重复寻找事件处理器的过程。如果在方法调用链中始终没有找到异常处理器,程序就会中止,并在控制台上打印出错误信息。
<4>如果在图形程序中出现了Exception子类的一个异常,java在控制台上打印错误,但程序回到处理用户界面的循环继续运行,忽略该异常。
<5>如果一个catch子句捕获了一个父类的异常,它就能捕获那个父类所有子类的异常对象。
<6>catch子句中指定异常的顺序非常重要。如果在父类的异常对象前没有指定这个异常对象,就会导致编译错误。
<7>通常情况下,异常处理需要更多的时间和资源。如果可能的话应该用判断语句测试简单的异常。而用异常去处理那些if语句不能解决的问题。
3.finally语句定义一个总是被执行的代码块,而不管有没有出现异常
-----------------------------
public void work() {
try{
开门
工作8个小时 //可能会抛出DiseaseException异常
}catch(DiseaseException e){
去医院看病;
}finally{
关门
}
}
finally语句不被执行的唯一情况是程序先执行了终止程序的System.exit()方法
注意:即使在函数中使用return()语句也不能禁止执行return()语句块
public static void main(String args[]){
try{
System.out.println("Begin");
return(); //在跳出本函数之前,仍然先执行finally语句块
System.exit(0);
}finally{
System.out.println("Finally");
}
System.out.println("End");
}
4.
异常处理流程
try{
code1; //可能抛出各种异常
}catch(SQLException e){
System.out.println("SQLException");
}catch(IOException e){
System.out.println("IOException");
}catch(Exception e){ //通常将异常继承关系中顶层异常放在最后
System.out.println("Exception");
}
5.
运行时异常 (不受检查异常)
java并未要求在方法中显示的声明运行时异常,这些异常异常会自动被JVM抛出
RuntimeException类及其子类都称为运行时异常,这种异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过,只会在运行时才报错。例如当以下divide()方法的参数b为0,执行“a/b”操作时会出现ArrithmeticException异常,它属于运行时异常,Java编译器不会检查它:
原因 :RuntimeException代表的是编程异常,这些错误是无法预料。所以不可能交给编译器在编译时做检查
public int divide(int a,int b){
return a/b; //当参数b为0,抛出ArrithmeticException
}
区分运行时异常和受检查异常
运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序(会抛出异常并终止程序),因此Java编译器不检查这种异常。
public void method(int[] array){
for(int i=0;i<=array.length;i++)
array[i]=1; //当i的取值为array.length时,将抛出ArrayIndexOutOfBoundsException
}
-------
修改为
public void method(int[] array){
for(int i=0;i array[i]=1; //不会抛出ArrayIndexOutOfBoundsException
}
-------------
受检查异常
表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。
如果一个方法可能出现受检查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出(当然也可以声明抛出它的父类异常),那么就需要在使用该方法的地方捕获异常或再一次将他抛出,否则在编译时就会导致编译错误。
void method1() throws IOException{} //合法
//编译错误,必须捕获或声明抛出IOException
void method2(){
method1();
}
//合法,声明抛出IOException
void method3()throws IOException {
method1();
}
------------------
//合法,声明抛出Exception
void method4() throws Exception {
method1();
}
//合法,捕获IOException
void method5(){
try{
method1();
}catch(IOException e){…}
}
------------------------
用户定义异常
用户定义异常是通过扩展Exception类或RuntimeException来创建的
class AnswerWrongException extends Exception {
private int result;
public AnswerWrongException (int result){
this.result=result;
}
public int getResult() {
return result;
}
}
----------------
public class ExceptionTester{
public static void test(int x,int y,int z)throws AnswerWrongException{
if(x+y!=z) throw new AnswerWrongException(z);
System.out.println(x+"+"+y+"="+z);
}
public static void main(String args[]) {
try{
test(1,2,5);
System.out.println("end");
}catch( AnswerWrongException e){
System.out.println("result is wrong:"+e.getResult());
e.printStackTrace();
}
}
}
------------------
案例分析:
public class Compute {
/**
* 方法本身处理异常,调用者就不能再处理
*/
public int work(int a,int b){
int result = 0;
try{
result = a/b;
}catch(Exception e){
e.printStackTrace();
}
return result;
}
/**
* 方法本身不做统一的异常处理
* 由调用者自己进行处理,能满足
* 调用者想进行不同处理的情况
*/
public int work1(int a,int b) throws Exception{
int result = 0;
result = a/b;
return result;
}
/**
* 方法本身进行异常的处理
* 同时调用者也进行各自的处理
* 需要在方法的catch里处理完后,再
* throw该异常对象
*/
public int work2(int a,int b) throws Exception{
int result = 0;
try{
result = a/b;
}catch(Exception e){
e.printStackTrace();
System.out.println("in work2");
throw e; //将这个异常抛给方法的调用者再进行处理
}
return result;
}
/**
* 使用返回值让调用者判断区分处理
*/
public int work3(){
///
//
int a = 12;
if(a==12){
return 1;
}
System.out.println("in work3");
return 2;
}
/**
* 使用抛出异常对象来达到让调用者区分
* 处理的目的
*/
public void work4() throws Exception{
int a = 12;
if(a==12){
throw new Exception(); //
}
System.out.println("in work4");
}
public void work5() throws RuntimeException{
int b = 12;
if(b==12){
throw new RuntimeException(); //可以起到流程控制的作用
}
System.out.println("in work5");
}
}
/**
* throws throw
* 1:使用的位置 throws 放在方法参数的后边
* throw 放在方法里面
* 2:从后面跟的内容 throws 异常的类名
* throw 异常类的对象
* 3:从功能 throws 表示该方法不处理异常,方法
* 产生的异常一定由调用者处理
* throw 主动抛出一个异常类的对象
*/
- 大小: 28.9 KB
分享到:
相关推荐
"Exception C++ & More Exception C++"可能是指两本关于深入理解和应用C++异常处理机制的书籍,其中包含"More Exceptional C++.chm"和"Exceptional C++.chm"这两个章节或部分。 异常处理是C++中的一个核心特性,它...
通过对这些知识点的学习,开发者可以更好地理解Android系统的底层机制,并有效定位和解决实际开发过程中遇到的问题。此外,掌握Native Exception的处理流程也是提高应用稳定性和性能的重要手段之一。
### Java中的异常处理详解 #### 一、异常基础概述 ...通过以上内容的学习,我们可以更好地理解Java中的异常处理机制,并能够在实际编程中合理运用各种异常处理技术,提升程序的健壮性和用户体验。
综上所述,“Uncaught DOMException:”错误是JavaScript编程中常见的一个问题,通过理解DOM工作原理、检查代码、使用开发者工具和学习最佳实践,我们可以有效地诊断和修复这类问题。对于那些经常进行前端开发的人员...
在编程世界中,错误处理是不可或缺的一部分,Java和许多其他编程语言中,"error"和"exception"这两个术语经常被提及。理解它们之间的区别对于编写健壮和可靠的代码至关重要。 首先,我们来看"error"。在Java中,`...
在Java编程语言中,异常处理是一项关键特性,用于处理程序运行时可能出现的错误或异常情况。...通过学习和掌握这一技能,开发者可以在面对复杂问题时,更好地控制和解决程序异常,确保代码的正常运行。
在C++编程中,异常处理是一项关键的错误处理机制,它允许程序员在程序运行时捕获和处理意外的情况。...提供的源码应该包含了如何在实际程序中使用这些概念的例子,是学习和理解C++异常处理的好资源。
在深入学习`streambuf`和`stdexcept`时,你需要理解: - `std::streambuf`的子类如`std::ifstreambuf`和`std::ostreambuf`,它们分别用于文件输入和输出。 - 如何自定义`std::streambuf`子类以处理特定的数据源或...
在编程领域,异常(Exception)是程序运行时出现的错误情况,它中断了正常的执行流程。这个基础题可能涉及到如何理解和处理Java中的异常...在实际工作中,我们需要不断地学习和实践,以应对各种复杂情况下的异常处理。
在C++编程语言中,异常处理是一个至关重要的概念,它允许程序员优雅地处理程序运行时可能出现的...通过深入学习“Exception C++ 和 More Exception C++”,你将能够更好地理解和应用这些概念,提高你的C++编程能力。
在C++编程中,异常处理是一项至关重要的技能,尤其是在面试中,熟练掌握异常处理机制能够展示出对程序健壮...通过学习和理解这些内容,你将能够在面试中自信地讨论和应用异常处理,从而提升你的编程技能和职业竞争力。
"log4j的使用.xls"可能是提供了一个关于如何配置和使用Log4j的教程或者示例。在Excel表格中,它可能包含了详细的步骤、配置参数解释,以及示例代码,帮助开发者理解如何设置Log4j以记录异常信息。例如,它可能会指导...
在压缩包中包含的文件"马士兵_J2SE第四章__Java_异常处理个人学习笔记.doc"很可能是一个详细的文档,总结了学习Java标准版(J2SE)第四章关于异常处理的内容。这份笔记可能涵盖了以下关键知识点: 1. **异常类的...
通过学习和实践VC++的异常处理,开发者能够编写出更健壮、更易于维护的代码,能够优雅地处理不可预见的运行时问题,提高程序的稳定性和可靠性。了解并熟练运用这些概念,对于提升编程技能和解决实际问题具有重要意义...
在IT行业中,异常处理是程序开发中不可或缺的一部分。异常(Exception)是程序运行时出现的错误情况,它中断了...通过不断学习和实践,我们可以更好地应对"exception 需要解决的问题",编写出更加健壮和可靠的软件。
### Hijacking Linux Page Fault Handler Exception Table中文版 #### 1. 引言 本文将详细介绍如何利用Linux内核中的一个特殊机制——页面...希望读者能够从中学习到有用的知识,并在实际工作中采取相应的安全措施。
在编程领域,异常处理是确保程序健壮性的重要一环,尤其是在Java这样的强类型语言中。...通过对给定的示例文件进行学习,我们可以更深入地了解如何在实际开发中应用这些原则,从而编写出更健壮的Java应用程序。
McMillan撰写的一本关于C++异常处理的深入书籍,由Addison-Wesley出版。这本书是为那些已经熟悉C++基础,希望进一步提升对异常处理机制理解的程序员准备的。通过阅读本书,读者能够掌握如何在C++编程中更有效地利用...