java基础学习日志--异常案例
2017-12-21 21:35
369 查看
package test7; public class InvalidScroreException extends Exception { public InvalidScroreException(String message) { super(message); } } 这是我自己定义的异常!
package test7; import java.util.Scanner; public class Demo { public static void main(String[] args) throws InvalidScroreException { Scanner sc = new Scanner(System.in); String line = sc.nextLine(); int num = 0; try { num = Integer.parseInt(line); System.out.println(num); if (num > 100 || num < 0) { throw new InvalidScroreException("请输入0-100"); } if (num < 60) { System.out.println("您没有通过考试!"); } if (num >= 60) { System.out.println(" 恭喜您通过了考试!"); } } catch (InvalidScroreException e) { e.printStackTrace(); InvalidScroreException e1=new InvalidScroreException("您输入的数字无效"); e1.printStackTrace(); } } }
发现:无论是自己new出来的异常,还是系统抛出来的异常,打印时都附带了异常对象出现的代码行数。
catch语句修改:
} catch (InvalidScroreException e) { throw e; }
发现:已经生成的异常,即使被抛出,但是打印出的异常信息中,出现异常的代码并非手动再次抛出的代码行数,而是异常第一次出现的代码行数。
有一个需求:
当输入不是数字时,会生成一个异常,但是我想返回一个带有“您输入的不是一个有效的整数!”异常信息的异常,那么该怎么修改呢?源代码中,当输入非数字时,会抛出一个无异常信息的异常被catch捕捉,这显然不是我想要的。那如果在catch语句块中重新throw一个带有“您输入的不是一个有效的整数!”的异常,这样打印异常信息时出现异常的代码行数就不是真正异常(即passInt()代码行数)出现的地方,而是在chtch语句块,所以这个方法不行。那岂不是在出现异常的地方抛出不就行了?尝试一下,可以。
public static void main(String[] args) throws InvalidScroreException { Scanner sc = new Scanner(System.in); String line = sc.nextLine(); int num = 0; try { try { num = Integer.parseInt(line); } catch (Exception e) { throw new InvalidScroreException("您输入的不是一个有效的整数!"); } if (num > 100 || num < 0) { throw new InvalidScroreException("请输入0-100"); } } catch (InvalidScroreException e) { e.printStackTrace(); } }
这样打印信息就可以完全正确了。
注意:这里有个小问题,嵌入try的try-catch语句中,catch语句中写(InvalidScroreException e)会显示无法到达,
改成Exception就行了。
虽然上一种方式可以实现需求,但是将可能出现异常的代码封装在一个函数里,用来调用,会显得更好一点,
public static int getScore() throws InvalidScroreException { Scanner sc = new Scanner(System.in); String line = sc.nextLine(); int num = 0; try { num = Integer.parseInt(line); } catch (Exception e) { throw new InvalidScroreException("您输入的不是一个有效的整数!"); } if (num > 100 || num < 0) { throw new InvalidScroreException("请输入0-100"); } return num; } public static void main(String[] args) throws InvalidScroreException { System.out.println("请输入成绩:"); try { System.out.println(Demo.getScore()); }catch(InvalidScroreException e){ e.printStackTrace(); } }
这样层次就更加分明了。这里也有和上一
a31f
种方式一样的问题,catch()语句块中写InvalidScroreException e 会显示无法到达,改成Exception就好了
总结:如果想抛出带有异常信息的异常,就必须自己手动抛出,其实自己抛出的带有异常信息的异常再被捕获时,会被重新赋值给用以捕获的异常,所以打印出来的异常是带有异常信息的。而jvm自己是不会抛出带有异常信息的异常的!
相关文章推荐
- java基础学习日志--String、StringBuffer方法案例
- java基础学习日志--Stirng内存案例
- 黑马程序员——java基础:异常学习日志
- java基础视频25days(毕老师)学习日志(day07、day08、day09、day10)
- 黑马程序员 java中关于异常的学习日志
- 黑马程序员-----Java基础学习异常
- java基础视频25days(毕老师)学习日志(day01、day02、day03)
- java基础视频25days(毕老师)学习日志(day17、day18、day19)
- 黑马程序员——黑马学习日志之三 Java基础03
- 黑马程序员—学习java基础5日志
- 黑马程序员——JAVA基础知识学习日志(一)
- 黑马程序员—学习java基础6日志
- java基础2学习日志
- 黑马程序员——黑马学习日志之四 Java基础——数组
- 黑马程序员——java基础学习(异常)
- java 从零开始,学习笔记之基础入门<异常>(十五)
- java基础视频25days(毕老师)学习日志(day20、day21)
- 黑马程序员 Java基础学习笔记11 异常
- java基础视频25days(毕老师)学习日志(day11、day12、day13)
- 黑马程序员——黑马学习日志之一 Java基础01