• Java作业7-Java异常处理


    异常处理这块有些不太理解,看看Bz网课-异常 

    编程1-计算器输入异常

    题目

    计算器输入异常

    在实验三中实现的命令行计算器已有功能基础上,添加异常处理机制,当用户输入的操作数为非整数时,利用异常处理机制显示错误提示信息。如: 

    $java Calculator 5 + 9 
    5+9=14 
    $java Calculator 5.1 + 9 
    Wrong Input first operand: 5.1 
    $java Calculator 5 + 9.1 
    Wrong Input second operand: 9.1 

    计算器👇 

    实验三题目4

    补充

    首先看一下Java parseInt() 方法

    看下这条代码↓

    1. public class Test{
    2. public static void main(String args[]){
    3. int x =Integer.parseInt("9.1");
    4. System.out.println(x);
    5. }
    6. }

    这条代码编译是不会报错的

    但是运行会出现异常↓

    1. Exception in thread "main" java.lang.NumberFormatException: For input string: "9.1"
    2. at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    3. at java.base/java.lang.Integer.parseInt(Integer.java:662)
    4. at java.base/java.lang.Integer.parseInt(Integer.java:778)
    5. at Test.main(Test.java:3)

    NumberFormatException即出现了数据类型异常

    题目代码

    1. public class Main {
    2. public static void main(String[] args) {
    3. int num1 = 0;
    4. int num2 = 0;
    5. // 异常处理用于验证第一个操作数
    6. try {
    7. num1 = Integer.parseInt(args[0]);
    8. } catch (NumberFormatException e) {
    9. System.out.println("Wrong Input first operand: " + args[0]);
    10. return;
    11. }
    12. // 异常处理用于验证第二个操作数
    13. try {
    14. num2 = Integer.parseInt(args[2]);
    15. } catch (NumberFormatException e) {
    16. System.out.println("Wrong Input second operand: " + args[2]);
    17. return;
    18. }
    19. char operator = args[1].charAt(0);
    20. int result = 0;
    21. switch (operator) {
    22. case '+':
    23. result = num1 + num2;
    24. System.out.printf("%d + %d = %d%n", num1, num2, result);
    25. break;
    26. case '-':
    27. result = num1 - num2;
    28. System.out.printf("%d - %d = %d%n", num1, num2, result);
    29. break;
    30. case 'x':
    31. result = num1 * num2;
    32. System.out.printf("%d x %d = %d%n", num1, num2, result);
    33. break;
    34. case '/':
    35. if (num2 != 0) {
    36. if (num1 % num2 == 0) {
    37. result = num1 / num2;
    38. System.out.printf("%d / %d = %d%n", num1, num2, result);
    39. } else {
    40. double divisionResult = (double) num1 / num2;
    41. System.out.printf("%d / %d = %.2f%n", num1, num2, divisionResult);
    42. }
    43. } else {
    44. System.out.println("Cannot divide by zero.");
    45. }
    46. break;
    47. default:
    48. System.out.println("Invalid operator: " + operator);
    49. break;
    50. }
    51. }
    52. }

    补充2,异常的一个例子

    多个异常处理
    try块中有多行代码,都有可能出现异常信息,程序执行的时候是从上往下执行的,当碰到异常情况的时候就会跳出try块,从而trny块中剩余的代码就不会执行了。

    1. public class Main2{
    2. public static void main(String[] args) {
    3. int i = 10;
    4. String str = null;
    5. int[] arr = new int[3];
    6. try {
    7. System.out.println(i/0);//当出现一个异常时,后面的异常是不会执行的
    8. System.out.println(str.length());
    9. arr[10] = 100;
    10. } catch (ArithmeticException e) {
    11. System.out.println("除数为0");
    12. } catch (NullPointerException e) {
    13. System.out.println("空指针异常");
    14. } catch (ArrayIndexOutOfBoundsException e) {
    15. System.out.println("数组下标越界异常");
    16. }
    17. }
    18. }
    除数为0

    补充3

    1. public class Main2{
    2. public static void main(String[] args) {
    3. int i = 10;
    4. String str = null;
    5. int[] arr = new int[3];
    6. try {
    7. System.out.println(i/0);//当出现一个异常时,后面的异常是不会执行的
    8. System.out.println(str.length());
    9. arr[10] = 100;
    10. } catch (Exception e){ //Exception能捕获到上述所有异常,应该把Exception异常这个父类放到最下面
    11. } catch (ArithmeticException e) {
    12. System.out.println("除数为0");
    13. } catch (NullPointerException e) {
    14. System.out.println("空指针异常");
    15. } catch (ArrayIndexOutOfBoundsException e) {
    16. System.out.println("数组下标越界异常");
    17. }
    18. }
    19. }
    1. Main2.java:12: 错误: 已捕获到异常错误ArithmeticException
    2. } catch (ArithmeticException e) {
    3. ^
    4. Main2.java:14: 错误: 已捕获到异常错误NullPointerException
    5. } catch (NullPointerException e) {
    6. ^
    7. Main2.java:16: 错误: 已捕获到异常错误ArrayIndexOutOfBoundsException
    8. } catch (ArrayIndexOutOfBoundsException e) {
    9. ^
    10. 3 个错误

    把Exception放到最下面就好了

    编程2-抛出异常,捕获异常

    题目

    定义一个类ThrowExceptionApp,其中包含两个方法f()和g(),其中在g()中,声明为能够抛出自定义异常类型OneException,并在方法实现中抛出此种异常类对象,该异常类的构造方法带一个字符串类型参数,构造实现时调用父类构造方法即可。在f()中,调用g(),捕获g()抛出的异常,并在catch子句中抛出另一个自定义异常类TwoException对象。在main方法中对抛出的异常进行正确处理 

    Exception类的构造方法👇

    题目代码

    首先声明,来自AI

    1. class OneException extends Exception {
    2. public OneException(String message) {
    3. super(message);
    4. }
    5. }
    6. class TwoException extends Exception {
    7. public TwoException(String message) {
    8. super(message);
    9. }
    10. }
    11. public class ThrowExceptionApp {
    12. public void g() throws OneException {
    13. throw new OneException("Exception from g()");
    14. }
    15. public void f() throws TwoException {
    16. try {
    17. g();
    18. } catch (OneException e) {
    19. throw new TwoException("Exception thrown from f(), caused by " + e.getMessage());
    20. }
    21. }
    22. public static void main(String[] args) {
    23. ThrowExceptionApp app = new ThrowExceptionApp();
    24. try {
    25. app.f();
    26. } catch (TwoException e) {
    27. System.out.println("Caught exception in main: " + e.getMessage());
    28. }
    29. }
    30. }
    Caught exception in main: Exception thrown from f(), caused by Exception from g()

    编程3-十六进制转换异常

    题目

    自定义一方法int hex2dec(String hStr)实现十六进制字符串到十进制整数的转换。如果输入参数为一非法的十六进制字符串,则抛出 NumberFormatException;自定义一异常类名为 HexFormatException,如果输入参数为非法的十六进制字符串,则抛出该异常类对象;并定义main实现对上述两种异常类型的检测和捕获 

    代码 

    1. import java.util.*;
    2. // 定义自定义异常类 HexFormatException
    3. class HexFormatException extends NumberFormatException {
    4. public HexFormatException(String message) {
    5. super(message);//沿用父类构造
    6. }
    7. }
    8. public class Main {
    9. //十六进制转化为十进制
    10. public static void main(String[] args) {
    11. Scanner input = new Scanner( System.in );
    12. String str = input.nextLine();
    13. int n=0; //存储十进制数
    14. try{
    15. for ( int i = 0;i < str.length();i++ ){
    16. n=n*16+Getbit(str.charAt(i));
    17. }
    18. System.out.println(n);
    19. } catch (HexFormatException e) {
    20. System.out.println(e.getMessage());
    21. }
    22. }
    23. public static int Getbit ( char c ) {
    24. if ( '0' <= c && c <= '9' )
    25. return c - '0';//在ASCII表中,数字字符和它自己的真值正好相差一个字符‘0’
    26. else if ( 'a' <= c && c <= 'f' )
    27. return c - 'a' + 10;//这种方法参考了CSDN
    28. else if ( 'A' <= c && c <= 'F' )
    29. return c - 'A' + 10;//这种方法参考了CSDN
    30. else
    31. throw new HexFormatException("Invalid hexadecimal char: " + c);
    32. }
    33. }

    编程4-统计学生成绩

    题目

    编写程序,输入至少10个数作为学生成绩,以"-1"作为成绩输入的结束,需要对成绩进行有效性判断,如果输入的成绩数据不为整数(参照 Scanner类的定义,nextInt方法会抛出InputMismatchException),需捕获异常,提示“请输入整数成绩”;如果输入的成绩数目不足10个,抛出并捕获数目不足异常,并提示“请输入至少10名学生的成绩”(可自定义异常)。如果输入有效,显示当前输入成绩的从高到低排序结果。不管发生何种情况,都显示“你已输入x名学生的成绩”。 

    在一切正常情况下的代码

    1. import java.util.*;
    2. public class Main {
    3. public static void main (String[] args){
    4. Scanner scanner = new Scanner(System.in);
    5. List scores = new ArrayList<>(); //ArrayList方法参考菜鸟教程
    6. int score = 0;
    7. System.out.println("请输入学生成绩(输入-1结束):"); //1 2 3 4 5 6 7 8 9 10
    8. while(true) {
    9. score = scanner.nextInt();
    10. if (score == -1)
    11. break;
    12. scores.add(score);
    13. }
    14. System.out.println("你已输入" + scores.size() + "名学生的成绩");
    15. scores.sort(Comparator.reverseOrder()); //菜鸟教程:sort() 方法根据指定的顺序对动态数组中的元素进行排序。
    16. for (int i : scores) {
    17. System.out.print(i + " ");
    18. }
    19. }
    20. }
    1. 请输入学生成绩(输入-1结束):
    2. 1 2 3 4 5 6 7 8 9 10 -1
    3. 你已输入10名学生的成绩
    4. 10 9 8 7 6 5 4 3 2 1

    加了异常处理后的代码

    异常情况

    代码

    1. import java.util.*;
    2. class InsufficientScoresException extends Exception {
    3. public InsufficientScoresException(String message) {
    4. super(message);
    5. }
    6. }
    7. public class Main {
    8. public static void main (String[] args){
    9. Scanner scanner = new Scanner(System.in);
    10. List scores = new ArrayList<>(); //ArrayList方法参考菜鸟教程
    11. int score = 0;
    12. System.out.println("请输入学生成绩(输入-1结束):"); //1 2 3 4 5 6 7 8 9 10
    13. try{
    14. while(true) {
    15. score = scanner.nextInt();
    16. if (score == -1)
    17. break;
    18. scores.add(score);
    19. }
    20. if (scores.size() < 10) {
    21. throw new InsufficientScoresException("成绩数目不足,至少需要10个成绩。");
    22. }
    23. scores.sort(Comparator.reverseOrder()); //菜鸟教程:sort() 方法根据指定的顺序对动态数组中的元素进行排序。
    24. System.out.println("成绩从高到低排序结果:");
    25. for (int i : scores) {
    26. System.out.print(i + " ");
    27. }
    28. System.out.println();
    29. } catch (InputMismatchException e) {
    30. System.out.println("请输入整数成绩");
    31. } catch (InsufficientScoresException e) {
    32. System.out.println(e.getMessage());
    33. } finally {
    34. System.out.println("你已输入" + scores.size() + "名学生的成绩。");
    35. }
    36. }
    37. }

    测试 

    测试1

    1. 请输入学生成绩(输入-1结束):
    2. 1 2 3 4 5 6 7 8 9 10 -1
    3. 成绩从高到低排序结果:
    4. 10 9 8 7 6 5 4 3 2 1
    5. 你已输入10名学生的成绩。

    测试2

    1. 请输入学生成绩(输入-1结束):
    2. 1 2 3 4 5 6 7 8 9 10.1 -1
    3. 请输入整数成绩
    4. 你已输入9名学生的成绩。

    测试3

    1. 请输入学生成绩(输入-1结束):
    2. 1 2 3 4 5 6 7 8 9 -1
    3. 成绩数目不足,至少需要10个成绩。
    4. 你已输入9名学生的成绩。

  • 相关阅读:
    OS Audit file could not be created; failing after 6 retries
    揭开服务网格~Istio Service Mesh神秘的面纱
    linux之目录结构
    高并发系统架构设计之实战篇:信息流设计之推模式
    1026 Table Tennis
    【MySQL】SQL语句
    C专家编程 第11章 你懂得C,所以C++不再话下 11.13 多态---运行时绑定
    就业班 第四阶段(k8s) 2401--6.4 day2 Dashboard+国产kuboard(好用)+简单命令
    nacos网关
    提供有效的绩效评估
  • 原文地址:https://blog.csdn.net/s1ms1mpleple/article/details/138152330