Java Web简明教程–Java篇[6]–处理异常

简介: Java Web简明教程–Java篇[6]–处理异常

之前一篇已经描述了如何在工作中处理一些突如其来的错误——异常,但是大王应该还是不会满意的,决策者的时间是很宝贵的,汇报的时候应该有针对性,要总结,不能乱七八糟的就把问题抛给大王,所以刑部连夜加班,修改制度流程如下:

import java.util.Scanner;//导入用于获取控制台输入的类Scanner
public class ExceptionDemo {//异常演示的例子
  public static void main(String[] args) {
  while(true){
    //使用无限循环模拟永远在线等待指令的场景
    Scanner sc = new Scanner(System.in);
    System.out.println("大王,我们刑部这次要除掉哪个奸臣:");
    String command = sc.nextLine();//模拟获取大王指令
    int army=100;//总兵力
    try{//可能有错误的语句放在try里面
    int commandInt=Integer.parseInt(command);//理解大王旨意,军机处比较傻,只能理解数字
    int result=army/commandInt;
    System.out.println("大王,搞定,我们除掉【"+commandInt+"】了!");//模拟响应用户指令
    }
    catch(ArithmeticException exArithmetic){
    System.out.println("大王,搞定,我们在搞掉【"+command+"】时遇到了算术问题,任务失败");
    }
    catch(NumberFormatException exNumber){
    System.out.println("大王,搞定,我们在搞掉【"+command+"】时遇到了字符串转换问题,任务失败");
    }
    catch(Exception ex){//此处在下面测试中不会执行,为何?
    System.out.println("大王,我们遇到问题了:"+ex.getMessage());
    }finally{
    System.out.println("大王,之前"+command+"事情都过去了,您看还有需要什么要指示的吗?");
    }
  }
  }
}

此时,刑部响应大王指令的过程如下:


大王,我们刑部这次要除掉哪个奸臣:
0
大王,搞定,我们在搞掉【0】时遇到了算术问题,任务失败
大王,之前0事情都过去了,您看还有需要什么要指示的吗?
大王,我们刑部这次要除掉哪个奸臣:
张三
大王,搞定,我们在搞掉【张三】时遇到了字符串转换问题,任务失败
大王,之前张三事情都过去了,您看还有需要什么要指示的吗?
大王,我们刑部这次要除掉哪个奸臣:


这下,问题经过整理后抛出,便于决策者分析。那么常见的有哪些问题呢(异常)。

刚刚上文提到的两种是非常好理解的,ArithmeticException 是数学计算异常,NumberFormatException是 数字转换格式异常。好的,平时常用的异常稍微总结下:


NullPointerException:空指向异常,如果一个对象没new 直接使用,所以引用没有指向堆的地址,所以引用没有意义啊,那是要报错的。

ArrayIndexOutOfBoundsException:数组下标越界,这个好理解。

EOFException:文件已结束。

FileNotFoundException:文件未找到。

SQLException:数据库异常

NoSuchMethodException:方法未找到

ClassNotFoundException:找不到类异常


好的,不管Java中提供了多少种未定义的异常,总有它想不到的或者是我们想设置的,比如,如果大王自己规定,人名不能是负数,这种要算大王糊涂错误,那怎么处理呢,不要紧,可以自定义异常。如下自定义一个异常类:



public class MinusException extends Exception{//自定义异常类,因为继承了Exception类,所以成为了异常家族的一员
  public MinusException(String message)//构造函数,包含一条消息  
    {  
        super(message);  
    }  
}



好的,这样使用即可:

import java.util.Scanner;//导入用于获取控制台输入的类Scanner
public class ExceptionDemo {//异常演示的例子
  public static void main(String[] args) {
  while(true){
    //使用无限循环模拟永远在线等待指令的场景
    Scanner sc = new Scanner(System.in);
    System.out.println("大王,我们刑部这次要除掉哪个奸臣:");
    String command = sc.nextLine();//模拟获取大王指令
    int army=100;//总兵力
    try{//可能有错误的语句放在try里面
    int commandInt=Integer.parseInt(command);//理解大王旨意,军机处比较傻,只能理解数字
    int result=army/commandInt;
    if(result<0)
      throw new MinusException("负数错误,负数为:"+commandInt);
    System.out.println("大王,搞定,我们除掉【"+commandInt+"】了!");//模拟响应用户指令
    }
    catch(MinusException exMinus){
    System.out.println("大王,搞定,我们在搞掉【"+command+"】时遇到了"+exMinus.getMessage());
    }
    catch(ArithmeticException exArithmetic){
    System.out.println("大王,搞定,我们在搞掉【"+command+"】时遇到了算术问题,任务失败");
    }
    catch(NumberFormatException exNumber){
    System.out.println("大王,搞定,我们在搞掉【"+command+"】时遇到了字符串转换问题,任务失败");
    }
    catch(Exception ex){
    System.out.println("大王,我们遇到问题了:"+ex.getMessage());
    ex.printStackTrace();
    }finally{
    System.out.println("大王,之前"+command+"事情都过去了,您看还有需要什么要指示的吗?");
    }
  }
  }
}


大王看到这个报告,终于露出了会心的笑容:小子们,你们的路还长着呢,嘿嘿嘿嘿


大王,我们刑部这次要除掉哪个奸臣:
-1
大王,搞定,我们在搞掉【-1】时遇到了负数错误,负数为:-1
大王,之前-1事情都过去了,您看还有需要什么要指示的吗?
大王,我们刑部这次要除掉哪个奸臣:
相关文章
|
3天前
|
Java 机器人 程序员
Java中如何处理ArrayIndexOutOfBoundsException异常?
Java中如何处理ArrayIndexOutOfBoundsException异常?
|
3天前
|
运维 Java 机器人
如何在Java中优雅地处理异常?
如何在Java中优雅地处理异常?
|
3天前
|
Java 机器人 程序员
Java中如何处理FileNotFoundException异常?
Java中如何处理FileNotFoundException异常?
|
2天前
|
JavaScript 程序员 应用服务中间件
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(2)
17 7
|
2天前
|
XML 存储 JavaScript
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
快速入门Web开发(上) 黑马程序员JavaWeb开发教程(1)
14 5
|
3天前
|
安全 IDE Java
Java中NullPointerException异常的处理方法详解
Java中NullPointerException异常的处理方法详解
|
3天前
|
Java 机器人 程序员
如何解决Java中的ClassCastException异常?
如何解决Java中的ClassCastException异常?
|
3天前
|
安全 Java 机器人
解决Java中的NumberFormatException异常的实用方法
解决Java中的NumberFormatException异常的实用方法
|
2天前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
|
2天前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。