• 检查异常处理方式:1,抛出;2,捕获


    异常:Exception

    一、什么是异常

    我们的程序在运行过程中产生的一些问题,这些问题有的是编码错误,有的是用户不正当操作引起的,有的是外部物理设备引起的。

    二、异常的继承结构

    Throwable:可抛出的

    -->EXception:异常

    一般都是程序编写问题或用户不正当操作引起的,

    通过程序代码来进行解决

    ------>编译期异常(检查异常)

    程序在编译期间,由编译器检查出来的异常,必须要处理,否则编译不能通过

    如:ParseException

    ------>运行时异常(非检查异常)

    所有的运行时异常会继承自RuntimeException;

    运行时异常在编译期间检测不到,但是在运行期间有可能会报异常,可以不处理也可以处理

    如:ArratyIndexOutOfBoundException

    classcastException

    NUllPointException

    -->Error:错误

    一般是由物理设备引起的,无法通过代码来解决,一般我们不要处理

    StackoverFlowError:栈溢出错误

    OutOfMemoryError:堆内存溢出

    1. import java.io.FileInputStream;
    2. import java.io.FileNotFoundException;
    3. import java.text.ParseException;
    4. import java.text.SimpleDateFormat;
    5. import java.util.Date;
    6. import java.util.Scanner;
    7. /*
    8. * 检查异常处理方式:抛出
    9. */
    10. public class TestException01 {
    11. /**
    12. * 调用m1()方法,因为m1()方法也没有处理异常,
    13. * 所以main()方法看到的就是有异常的m1()方法
    14. * main()方法继续向上抛出异常,最终抛给了jvm虚拟机
    15. * jvm打印出异常的堆栈信息
    16. *
    17. * 客人:服务员将炒糊的菜端给了客人,客人看到的菜就是炒糊的菜
    18. * @param args
    19. * @throws Exception
    20. */
    21. public static void main(String[] args) throws Exception {
    22. //看到两个异常的m01()方法
    23. //客人看到的菜是既炒糊了,又没盐的
    24. //看到的就是只有一个父异常的m1()方法
    25. //客人也只知道才没炒好,不指定具体哪里没炒好
    26. //m01();
    27. m02();
    28. }
    29. /**
    30. * 调用m0方法,因为m0中抛出异常,所以调用就是有异常的m0()方法
    31. *
    32. * m1()可以选择继续向上抛出,谁来调用m1()这个方法就抛给谁
    33. * 服务员:去取厨师炒的菜,看到就是炒糊的菜
    34. * @throws Exception
    35. */
    36. public static void m1() throws Exception {
    37. //看到两个异常的m01()方法
    38. //服务员看到的菜是既炒糊了,又没盐的
    39. //m01();
    40. //服务员只知道菜没炒好,但不知道具体哪没炒好
    41. /*
    42. * m1()只会看到父异常的Exception,不知道哪个没炒好
    43. */
    44. m02();
    45. }
    46. /*
    47. * 让用户控制台输入一个指定格式字符串
    48. * 然后将这个字符串解析为日期对象
    49. *
    50. * 异常:菜炒糊了
    51. * :没放盐
    52. * :油多了
    53. * 抛出:不处理,向上抛出不管,
    54. * 谁来调用这个方法,谁处理
    55. * @throws:ParseException
    56. * @throws:FileNotFoundException
    57. */
    58. public static void m01() throws ParseException, FileNotFoundException {
    59. System.out.println("请输入日期(yyyy-MM-dd)");
    60. String dateStr=new Scanner(System.in).nextLine();
    61. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    62. Date date =sdf.parse(dateStr);
    63. System.out.println("date="+date);
    64. //尝试去连接一个磁盘文件
    65. FileInputStream in=new FileInputStream ("D:/a.text");
    66. }
    67. /*
    68. * 让用户控制台输入一个指定格式字符串
    69. * 然后将这个字符串解析为日期对象
    70. *
    71. * 异常:菜炒糊了
    72. * :没放盐
    73. * :油多了
    74. *
    75. *总问题:没炒好
    76. * 抛出:不处理,向上抛出不管,
    77. * 谁来调用这个方法,谁处理
    78. * 抛出的是一个父类型的异常
    79. * @throws:ParseException
    80. * @throws:FileNotFoundException
    81. */
    82. public static void m02() throws Exception {
    83. System.out.println("请输入日期(yyyy-MM-dd)");
    84. String dateStr=new Scanner(System.in).nextLine();
    85. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    86. Date date =sdf.parse(dateStr);
    87. System.out.println("date="+date);
    88. //尝试去连接一个磁盘文件
    89. FileInputStream in=new FileInputStream ("D:/a.text");
    90. }
    91. }

    2、捕获

    如果异常需要自己处理,也可以在方法内部通过try~catch 来对异常进行捕获并处理,那么方法调用者就不需要再去

    处理异常了

    语法:

    try{

    //有检查异常的代码块

    }catch(XXException e){

    //捕获异常并处理

    }catch(XXException e){

    //捕获异常并处理

    }。。。

    finally{

    //最终执行代码块。可以没有

    }

    注意:

    1》try中代码块出现了异常,那么跟在这一行的后面的try中代码都不执行

    2》finally为最终执行代码块,是必须要执行的,即使try或者catch中有return,也会先去执行finally中代码,再回去执行return

    3》如果有多个检查异常,catch可以有多个这些异常之间如果有父子关系,那么子类型必须写在父类型的上面,否则捕获不到或者通过一个catch类型捕获这多个异常的父类型异常

    4》如果有必须要执行的代码块,可以单独使用try和finally

    5》运行时异常通常不需要处理,

    如果要处理,也可以按照检查异常一样去处理

    1. import java.io.FileInputStream;
    2. import java.io.FileNotFoundException;
    3. import java.io.IOException;
    4. import java.text.ParseException;
    5. import java.text.SimpleDateFormat;
    6. import java.util.Date;
    7. import java.util.Scanner;
    8. /**
    9. * 异常处理方式:捕获
    10. *
    11. */
    12. public class TestException02 {
    13. public static void main(String[] args) {
    14. //客人看到的就是没有问题的菜
    15. m03();
    16. }
    17. /*
    18. * 因为厨师自己处理了炒糊的菜
    19. * 服务员考到的就是没有问题的菜
    20. *
    21. *
    22. *
    23. * 因为m0()方法自己捕获了异常
    24. * 所以m1()在调用m0()时不需要在处理异常了
    25. */
    26. public static void m1() {
    27. m03();
    28. }
    29. /**
    30. * 让用户控制台输入一个指定格式字符串
    31. * 然后将这个字符串解析为日期对象
    32. *
    33. * 异常:菜炒糊了
    34. * :没放盐
    35. * :油多了
    36. * 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
    37. * @throws:ParseException
    38. * @throws:FileNotFoundException
    39. */
    40. public static void m0() {
    41. System.out.println("请输入日期(yyyy-MM-dd)");
    42. String dateStr = new Scanner(System.in).nextLine();
    43. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    44. Date date;
    45. try {
    46. // 尝试去运行这块代码
    47. date = sdf.parse(dateStr);
    48. //try中代码出现异常,那么跟在后面的代码都不执行
    49. System.out.println("date=" + date);
    50. return;
    51. } catch (ParseException e) {
    52. // 只有Try中代码出现了异常
    53. // 才会catch中的代码
    54. System.out.println("==处理炒糊的菜==");
    55. //参数e代表捕获到的异常
    56. System.out.println("e:"+e);
    57. //获取异常信息
    58. String message =e.getMessage();
    59. System.out.println("message:"+message);
    60. //与jvm一样,打印输出异常的堆栈信息
    61. //e.printStackTrace();
    62. return;
    63. }finally {
    64. //最终执行代码块,无论try中代码有无异常
    65. //或try和catch中有无return,都会来执行的代码
    66. System.err.println("====最终执行代码块====");
    67. }
    68. }
    69. /**
    70. * 让用户控制台输入一个指定格式字符串
    71. * 然后将这个字符串解析为日期对象
    72. *
    73. * 异常:菜炒糊了
    74. * :没放盐
    75. * :油多了
    76. * 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
    77. * @throws:ParseException
    78. * @throws:FileNotFoundException
    79. */
    80. public static void m01() {
    81. System.out.println("请输入日期(yyyy-MM-dd)");
    82. String dateStr = new Scanner(System.in).nextLine();
    83. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    84. Date date;
    85. try {
    86. // 尝试去运行这块代码
    87. date = sdf.parse(dateStr);
    88. //从磁盘上读取数据,可能会发生读取异常
    89. FileInputStream in=new FileInputStream ("D:/a.text");
    90. in.read();
    91. //try中代码出现异常,那么跟在后面的代码都不执行
    92. System.out.println("date=" + date);
    93. return;
    94. } catch (ParseException e) {
    95. // 只有Try中代码出现了异常
    96. // 才会catch中的代码
    97. System.out.println("==日期解析异常==");
    98. //参数e代表捕获到的异常
    99. System.out.println("e:"+e);
    100. //获取异常信息
    101. String message =e.getMessage();
    102. System.out.println("message:"+message);
    103. //与jvm一样,打印输出异常的堆栈信息
    104. //e.printStackTrace();
    105. return;
    106. } catch (FileNotFoundException e) {
    107. //只有try中代码发生了文件未找到异常才能进入到这里执行
    108. //因为FileNotFoundException是IOException的子类型
    109. //要放在父类型的上面
    110. System.out.println("==文件未找到异常==");
    111. } catch (IOException e) {
    112. System.out.println("===文件读取异常====");
    113. e.printStackTrace();
    114. }finally {
    115. // e.printStackTrace();
    116. //最终执行代码块,无论try中代码有无异常
    117. //或try和catch中有无return,都会来执行的代码
    118. System.err.println("====最终执行代码块====");
    119. }
    120. }
    121. /**
    122. * 让用户控制台输入一个指定格式字符串
    123. * 然后将这个字符串解析为日期对象
    124. *
    125. * 异常:菜炒糊了
    126. * :没放盐
    127. * :油多了
    128. * 捕获:厨师自己处理炒糊的菜(摘出来,重新炒)
    129. * @throws:ParseException
    130. * @throws:FileNotFoundException
    131. */
    132. public static void m02() {
    133. System.out.println("请输入日期(yyyy-MM-dd)");
    134. String dateStr = new Scanner(System.in).nextLine();
    135. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    136. Date date;
    137. try {
    138. // 尝试去运行这块代码
    139. date = sdf.parse(dateStr);
    140. //从磁盘上读取数据,可能会发生读取异常
    141. FileInputStream in=new FileInputStream ("D:/a.text");
    142. in.read();
    143. //try中代码出现异常,那么跟在后面的代码都不执行
    144. System.out.println("date=" + date);
    145. return;
    146. } catch (Exception e) {
    147. System.out.println("==发生了异常,菜没炒好==");
    148. if(e instanceof ParseException) {
    149. System.out.println("日期");
    150. }else if(e instanceof FileNotFoundException) {
    151. System.out.println("文件没找到");
    152. }else if(e instanceof IOException) {
    153. System.out.println("读取异常");
    154. }else {
    155. System.out.println("其他异常");
    156. }
    157. return;
    158. } finally {
    159. // e.printStackTrace();
    160. //最终执行代码块,无论try中代码有无异常
    161. //或try和catch中有无return,都会来执行的代码
    162. System.err.println("====最终执行代码块====");
    163. }
    164. }
    165. /**
    166. * 运行时候异常:通常不需要处理
    167. * 如果想处理,也可以按照检查异常去处理
    168. *
    169. * 如果有必要执行的代码
    170. * try和finally可以单独使用
    171. */
    172. public static void m03() {
    173. String arr[]= {"aa","bb","cc"};
    174. // try {
    175. // System.out.println(arr[5]);
    176. // }catch(ArrayIndexOutOfBoundsException e) {
    177. // System.out.println("数组下标越界异常");
    178. // }
    179. try {
    180. System.out.println(arr[1]);
    181. }finally {
    182. System.out.println("123456789");
    183. }
    184. }
    185. }

     

  • 相关阅读:
    JavaScript项目1_猜数字(前导)
    岛屿问题(用DFS遍历二维数组)
    Linux 系统函数
    第四章 决策树
    C++PrimerPlus(第6版)中文版:Chapter16.5.1函数对象_函数符概念
    Win11不识别蓝牙适配器的解决方法
    一些文本在CSS上的作用
    八、2023.10.2.Linux(二).8
    仿真软件Proteus8.9 SP2 Pro 下载、安装、汉化详细图文教程
    Kubernetes 部署 kubeflow1.6.1
  • 原文地址:https://blog.csdn.net/m0_72254454/article/details/126611326