异常专题

/*

 * 一、异常体系结构

 * 

 * java.lang.Throwable

 * |-----java.lang.Error:一般不编写针对性的代码进行处理。

 * |-----java.lang.Exception:可以进行异常的处理

 * |------编译时异常(checked)

 * |-----IOException

 * |-----FileNotFoundException

 * |-----ClassNotFoundException

 * |------运行时异常(unchecked,RuntimeException)

 * |-----NullPointerException

 * |-----ArrayIndexOutOfBoundsException

 * |-----ClassCastException

 * |-----NumberFormatException

 * |-----InputMismatchException

 * |-----ArithmeticException

 * 

/*

 * Error:

 * Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。

 * 

 * 一般不编写针对性的代码进行处理。

 */

 * 

/*

 * 方法重写的规则之一:

 * 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

原因:用多态性的思路可以解释

 * 

 */

 * 面试题:常见的异常都有哪些?举例说明

 */

/*

 * 一、异常的处理:抓抛模型

 * 

 * 过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。

 *           并将此对象抛出。(谁调用就抛给谁)

 *           一旦抛出对象以后,其后的代码就不再执行。

 * 

 * 关于异常对象的产生:① 系统自动生成的异常对象

 *  ② 手动的生成一个异常对象,并抛出(throw)

 * 

 * 过程二:"抓":可以理解为异常的处理方式:① try-catch-finally  ② throws

 * 

 * 

 * 二、try-catch-finally的使用

 * 

 * try{

 * //可能出现异常的代码

 * 

 * }catch(异常类型1 变量名1){

 * //处理异常的方式1

 * }catch(异常类型2 变量名2){

 * //处理异常的方式2

 * }catch(异常类型3 变量名3){

 * //处理异常的方式3

 * }

 * ....

 * finally{

 * //一定会执行的代码

 * }

 * 

 * 说明:

 * 1. finally是可选的。

 * 2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象

 *    的类型,去catch中进行匹配

 * 3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的

 *    try-catch结构(在没有写finally的情况)。继续执行其后的代码

 * 4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。

 *    catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错

 * 5. 常用的异常对象处理的方式: ① String  getMessage()    ② printStackTrace()

 * 6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用

 * 7. try-catch-finally结构可以嵌套

 * 

 * 体会1:使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。

 *     相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

 *     

 * 体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。

 *      针对于编译时异常,我们说一定要考虑异常的处理。

 */

/*

 * try-catch-finally中finally的使用:

 * 

 * 

 * 1.finally是可选的

 * 

 * 2.finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有

 * return语句等情况。(程序中需要返回值时     方法需要返回值 )多个返回值return 的时候 返回finally中的return

 * 

 * 3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的

 *   释放。此时的资源释放,就需要声明在finally中。

 */

/*

 * 异常处理的方式二:throws + 异常类型

 * 

 * 1. "throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。

 *     一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常

 *     类型时,就会被抛出。异常代码后续的代码,就不再执行!

 *     

 * 2. 体会:try-catch-finally:真正的将异常给处理掉了。

 *        throws的方式只是将异常抛给了方法的调用者。  并没有真正将异常处理掉。  

 * 

 * 3. 开发中如何选择使用try-catch-finally 还是使用throws?

 *   3.1 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果

 *       子类重写的方法中有异常,必须使用try-catch-finally方式处理。

 *   3.2 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws

 *       的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

(否则其中某方法处理完后得到的是处理过异常的数据不一定是正确的,往后执行就没得意思了)

 * 

 */

public class ExceptionTest {

//******************以下是编译时异常***************************

@Test

public void test7(){

// File file = new File("hello.txt");

// FileInputStream fis = new FileInputStream(file);

//

// int data = fis.read();

// while(data != -1){

// System.out.print((char)data);

// data = fis.read();

// }

//

// fis.close();

}

//******************以下是运行时异常***************************

//ArithmeticException

@Test

public void test6(){

int a = 10;

int b = 0;

System.out.println(a / b);

}

//InputMismatchException

@Test

public void test5(){

Scanner scanner = new Scanner(System.in);

int score = scanner.nextInt();

System.out.println(score);

scanner.close();

}

//NumberFormatException

@Test

public void test4(){

String str = "123";

str = "abc";

int num = Integer.parseInt(str);

}

//ClassCastException

@Test

public void test3(){

Object obj = new Date();

String str = (String)obj;

}

//IndexOutOfBoundsException

@Test

public void test2(){

//ArrayIndexOutOfBoundsException

// int[] arr = new int[10];

// System.out.println(arr[10]);

//StringIndexOutOfBoundsException

String str = "abc";

System.out.println(str.charAt(3));

}

//NullPointerException

@Test

public void test1(){

// int[] arr = null;

// System.out.println(arr[3]);

String str = "abc";

str = null;

System.out.println(str.charAt(0));

} 

}

 

猜你喜欢

转载自www.cnblogs.com/terrycode/p/12316506.html