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自己是不会抛出带有异常信息的异常的!

java基础学习日志--异常案例的更多相关文章

  1. Java基础学习补充 -- 异常处理和log4j日志

    Java中的异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. Java中所有异常的基类Throwable:Throwable又分为Error类和Excepti ...

  2. java基础学习日志--String、StringBuffer方法案例

    package StringDemo; import java.util.Arrays; /* * 常用String.StringBufer类的方法 */ public class Demo1 { p ...

  3. java基础学习日志--Stirng内存案例

    案例一: public class test1 { public static void mb_swap(String Str1,String Str2) { String temp=Str1; St ...

  4. java基础学习日志---File方法分析

    package FunDemo; import java.io.File; import java.io.IOException; import java.util.Arrays; public cl ...

  5. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  6. Java基础学习(3)

    Java基础学习(三) Java异常 Throwable类:所有异常的祖先类 Error:虚拟机异常.内存错误.没法处理 Exception:编码.环境.用户操作输入出现问题 非检查异常(自动捕获): ...

  7. 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据

    070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...

  8. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  9. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

随机推荐

  1. go15---select

    package main import ( "fmt" ) //go语言提供了一个结构或者形式来帮助处理多个channel的发送和接收问题,这个结构叫做select, //sele ...

  2. go语言---slice

    go语言---slice https://blog.csdn.net/cyk2396/article/details/78893420 一.数组切片的使用: //1.基于数组创建数组切片 var ar ...

  3. linux中touch命令参数修改文件的时间戳(转载)

    转自:http://os.51cto.com/art/200908/144237.htm linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存 ...

  4. 关于Jedis无法连接上Linux上Redis问题

    环境:CentOS7.Redis 主要解决Jedis客户端无法连接Linux上Redis服务问题 1.修改Redis目录下的redis.conf配置文件 注释掉bind本地回环地址:bind 127. ...

  5. bzoj 4719: [Noip2016]天天爱跑步【树上差分+dfs】

    长久以来的心理阴影?但是其实非常简单-- 预处理出deep和每组st的lca,在这里我简单粗暴的拿树剖爆算了 然后考虑对于一组s t lca来说,被这组贡献的观察员x当且仅当: x在s到lca的路径上 ...

  6. 用 python 写一个模拟玩家移动的示例

    实例:二维矢量模拟玩家移动 在游戏中,一般使用二维矢量保存玩家的位置,使用矢量计算可以计算出玩家移动的位置,下面的 demo 中,首先实现二维矢量对象,接着构造玩家对象,最后使用矢量对象和玩家对象共同 ...

  7. CSS左侧固定右侧自适应

    方法一: float + margin.left{ float: left; width: 100px; }.right {margin-left:100px; } /*清除浮动*/ .contain ...

  8. VF 查表

    题目的意思就是 给你一个数字 n (1~81)  然后问你从 1~10^9  之中有多少个 各位数字之和等于 n 的 数字 我上去   打表了  而且速度还差不多 , 能在 几十分钟内算出来所有答案 ...

  9. java list遍历三种方法

    JSONArray jsonArray = new JSONArray(); jsonArray.add("1"); jsonArray.add("2"); j ...

  10. 后台管理进程GameMaster

    初步准备在后台加一个进程,用来控制进程中的各种数据,修改,查看,删除玩家数据类似于后端的gm控制平台