【JAVA】Java 异常处理
1、什么是异常?
将程序执行中发生的不正常情况称为“异常”
2、Java程序在执行过程中所发生的异常事件可分为两类
java.lang.Error:一般不编写针对性的代码进行处理
java.lang.Exception:可以进行异常的处理
Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源 耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性 的代码进行处理。
package com.err; /* * Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源 耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性 的代码进行处理 */ public class DemoErr { public static void main(String[] args) { // 1.java.lang.StackOverflowError 栈溢出 // main(args); // 2.java.lang.OutOfMemoryError 堆溢出 Integer[] array = new Integer[1024*1024*1024]; } }
执行结果:
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使 用针对性的代码进行处理
编译时异常:IOException、 FileNotFoundException、 ClassNotFoundException
运行时异常:NullPointerException、 ArrayIndexOutOfBoundsException、 ClassCastException、 NumberFormatException、 InputMismatchException
package com.err; import java.util.Date; import java.util.Scanner; public class DemoRunExcept { // NullPointerException 空指针异常 public void NullPointerE() { Integer[] array = null; // 空指针举例 System.out.println(array[0]); } // ArrayIndexOutOfBoundsException 角标越界 public void ArrayIndexE(){ int[] array = new int[2]; // 数组角标越界举例 System.out.println(array[2]); } // ClassCastException 类型转换异常 public void ClassCastE() { Object obj = new Date(); String str = (String)obj; System.out.println(str); } // NumberFormatException 数字转换异常 public void NumberFormatE() { String num = "123a"; int number = Integer.parseInt(num); System.out.println(number); } // InputMismatchException 输入不匹配 public void InputMisE() { Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); // 键盘输入abc System.out.println(score); } public static void main(String[] args) { DemoRunExcept demoRunExcept = new DemoRunExcept(); demoRunExcept.NullPointerE(); demoRunExcept.ArrayIndexE(); demoRunExcept.ClassCastE(); demoRunExcept.NumberFormatE(); demoRunExcept.InputMisE(); } }
执行结果:
……
3、解决异常的方法
① 遇到错误就终止程序 的运行
② 编写程序时,对错误进行处理(如:抛出提示信息等)
4、异常处理
1)try-catch-finally <真正的将异常给处理掉>
try 块:用于捕获异常 <try 后必须存在catch和finally其中之一或全部 >
catch 块:用于处理try捕获到的异常
<catch不会被执行的情况:① try语句没有被执行; ② try语句未触发异常 ③ 异常类型不匹配 >
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行;
<当try块中或者catch块中遇到return语句时,先执行完finally中的代码,再执行return语句且不会执行finally后续代码>
<finally不会被执行的情况:① try语句没有被执行; ② try内包含exit等终止程序的操作>
语法:
try{ // 可能出现异常的代码 }catch(异常类型1 变量1){ // 异常类型1处理方式 }catch(异常类型2 变量2){ // 异常类型2处理方式 } ... finally{ // 无论有无异常一定会执行的代码 }
示例
package com.err; public class DemoTry { public static void main(String[] args) { try{ Integer[] array = null; // 空指针举例 System.out.println(array[0]); }catch(NullPointerException npe){ npe.printStackTrace(); System.out.println("catch"); }finally{ System.out.println("over~"); } } }
执行结果:
2)throw 语句抛出异常
throw 捕获之后再抛出, 将异常抛出给调用方法,未对异常做出处理
throw要么和try-catch-finally语句配套使用,要么与throws配套使用
throw (异常对象);
package com.err; public class DemoTry { public void DemoThrowMethod(){ try{ Integer[] array = null; // 空指针举例 System.out.println(array[0]); }catch(NullPointerException npe){ throw npe; }finally{ System.out.println("over~"); } }
public static void main(String[] args) { DemoTry demoTry = new DemoTry(); demoTry.DemoThrowMethod(); } }
执行结果:
3)throws 出现异常的一种可能性,并不一定会发生这些异常
throws 抛出且不处理异常 ,可以单独使用
[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{ }
package com.err; import java.io.IOException; public class DemoTry { public void DemoThrowsMethod() throws NullPointerException, Exception { Integer[] array = null; // 空指针举例 System.out.println("throws"); System.out.println(array[0]); } public static void main(String[] args) { DemoTry demoTry = new DemoTry(); try { demoTry.DemoThrowsMethod(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } }
执行结果:
4)手动抛出异常
手动的生成一个异常对象,并抛出(throw) <仅抛出异常不进行出,所以需要捕获获取 若未捕获会出现:java: 未报告的异常错误java.lang.Exception; 必须对其进行捕获或声明以便抛出>
package com.err; import java.io.IOException; public class DemoTry { public void DemoThrowsMethod() throws NullPointerException, Exception { throw new Exception("自定义异常");//手动抛出异常 } public static void main(String[] args) { DemoTry demoTry = new DemoTry(); try { demoTry.DemoThrowsMethod(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } } }
执行结果
5)自定义异常
1、通过继承 Exception 来实现自定义异常
2、自定义异常类的类名命名为 XXXException
<class><自定义异常名><extends><Exception>{ …… }
package com.err; // 通过继承 Exception 来实现自定义异常 class MyException extends Exception { // 无参的默认构造方法 public MyException(){ super(); } // 以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。 public MyException(String s){ super(s); } } public class DemoMyException { public static void main(String[] args) { try { throw new MyException("抛出自定义异常"); } catch (MyException e) { System.out.println(e); e.printStackTrace(); } } }
执行结果
拓展1:异常打印
try{……} catch(Exception e){……}
System.out.println(e):这个方法打印出异常,并且输出在哪里出现的异常;
e.printStackTrace():打印出异常,但是它还将显示出更深的调用信息
package com.err; public class DemoTry { public void DemoThrowMethod(){ try{ Integer[] array = null; // 空指针举例 System.out.println(array[0]); }catch (NullPointerException npe){ System.out.println(npe); System.out.println("========分割线========"); npe.printStackTrace(); }finally{ System.out.println("over~"); } } public static void main(String[] args) { DemoTry demoTry = new DemoTry(); demoTry.DemoThrowMethod(); } }
执行结果:
参考地址:https://www.cnblogs.com/laizhenghua/articles/13054556.html
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------