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();
}
}

这样层次就更加分明了。这里也有和上一种方式一样的问题,catch()语句块中写InvalidScroreException e 会显示无法到达,改成Exception就好了


总结:如果想抛出带有异常信息的异常,就必须自己手动抛出,其实自己抛出的带有异常信息的异常再被捕获时,会被重新赋值给用以捕获的异常,所以打印出来的异常是带有异常信息的。而jvm自己是不会抛出带有异常信息的异常的!

最新文章

  1. css3之自定义字体
  2. paper 103:ELM算法
  3. Unity3D 实现简单的语音聊天 [iOS版本]
  4. 清理sql2000查询分析器登录名记录
  5. Linux 命令 - cp: 拷贝文件和目录
  6. Android 控制ScrollView滚动到底部
  7. java集合框架示例图
  8. The iOS Design Cheat Sheet 界面设计速参
  9. 多个viewpager可能产生的问题
  10. Top 100 Best Blogs for iOS Developers
  11. QTP自动化测试流程
  12. 2017湘潭大学邀请赛H题(树的直径)
  13. ubuntu 16.04 安装和配置vncserver
  14. 小程序客服下发消息禁止后 session from 还有用吗?
  15. 3237: [Ahoi2013]连通图 线段树分治
  16. vs2013添加mysql对EF的支持(转+说明)
  17. 一个简单的 openssl 示例
  18. layer使用
  19. JS求一个数组元素的最小公倍数
  20. 【待填坑】ajax问题

热门文章

  1. C++new失败的处理(如果 new 分配内存失败,默认是抛出异常的,但也可以取消异常)
  2. JPG文件格式
  3. 三种解密 HTTPS 流量的方法介绍
  4. Python中关键字global与nonlocal的区别
  5. 测试神器Swagger的相关使用
  6. 反向代理与Real-IP和X-Forwarded-For(转)
  7. 经典矩阵dp寻找递增最大长度
  8. 面向过程与面向对象引入三大特性&amp;&amp;事务
  9. 类函数:string、math
  10. CF817C Really Big Numbers