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() 方法

看下这条代码↓

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

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

但是运行会出现异常↓

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

NumberFormatException即出现了数据类型异常

题目代码

public class Main {
    public static void main(String[] args) {
        
        int num1 = 0;
        int num2 = 0;
        
        // 异常处理用于验证第一个操作数
        try {
            num1 = Integer.parseInt(args[0]);
        } catch (NumberFormatException e) {
            System.out.println("Wrong Input first operand: " + args[0]);
            return;
        }
        
        // 异常处理用于验证第二个操作数
        try {
            num2 = Integer.parseInt(args[2]);
        } catch (NumberFormatException e) {
            System.out.println("Wrong Input second operand: " + args[2]);
            return;
        }
        
        char operator = args[1].charAt(0);
        int result = 0;
        switch (operator) {
            case '+':
                result = num1 + num2;
                System.out.printf("%d + %d = %d%n", num1, num2, result);
                break;
            case '-':
                result = num1 - num2;
                System.out.printf("%d - %d = %d%n", num1, num2, result);
                break;
            case 'x':
                result = num1 * num2;
                System.out.printf("%d x %d = %d%n", num1, num2, result);
                break;
            case '/':
                if (num2 != 0) {
                    if (num1 % num2 == 0) {
                        result = num1 / num2;
                        System.out.printf("%d / %d = %d%n", num1, num2, result);
                    } else {
                        double divisionResult = (double) num1 / num2;
                        System.out.printf("%d / %d = %.2f%n", num1, num2, divisionResult);
                    }
                } else {
                    System.out.println("Cannot divide by zero.");
                }
                break;
            default:
                System.out.println("Invalid operator: " + operator);
                break;
        }
    }
}

补充2,异常的一个例子

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

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

补充3

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

把Exception放到最下面就好了

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

题目

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

Exception类的构造方法👇

题目代码

首先声明,来自AI

class OneException extends Exception {
    public OneException(String message) {
        super(message);
    }
}

class TwoException extends Exception {
    public TwoException(String message) {
        super(message);
    }
}
public class ThrowExceptionApp {

    public void g() throws OneException {
        throw new OneException("Exception from g()");
    }

    public void f() throws TwoException {
        try {
            g();
        } catch (OneException e) {
            throw new TwoException("Exception thrown from f(), caused by " + e.getMessage());
        }
    }

    public static void main(String[] args) {
        ThrowExceptionApp app = new ThrowExceptionApp();
        try {
            app.f();
        } catch (TwoException e) {
            System.out.println("Caught exception in main: " + e.getMessage());
        }
    }
}
Caught exception in main: Exception thrown from f(), caused by Exception from g()

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

题目

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

代码 

import java.util.*;

// 定义自定义异常类 HexFormatException
class HexFormatException extends NumberFormatException {
    public HexFormatException(String message) {
        super(message);//沿用父类构造
    }
}
public class Main {
	//十六进制转化为十进制
	public static void main(String[] args) {
		Scanner input = new Scanner( System.in );
		String str = input.nextLine();
		int n=0;	//存储十进制数
		try{
			for ( int i = 0;i < str.length();i++ ){
				n=n*16+Getbit(str.charAt(i));
			}
			System.out.println(n);
		} catch (HexFormatException e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static int Getbit ( char c ) { 
		if ( '0' <= c && c <= '9' )
			return c - '0';//在ASCII表中,数字字符和它自己的真值正好相差一个字符‘0’
		else if ( 'a' <= c && c <= 'f' )
			return c - 'a' + 10;//这种方法参考了CSDN
		else if ( 'A' <= c && c <= 'F' )
			return c - 'A' + 10;//这种方法参考了CSDN
		else
			throw new HexFormatException("Invalid hexadecimal char: " + c);
	}
}

编程4-统计学生成绩

题目

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

在一切正常情况下的代码

import java.util.*;

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

加了异常处理后的代码

异常情况

代码

import java.util.*;

class InsufficientScoresException extends Exception {
    public InsufficientScoresException(String message) {
        super(message);
    }
}

public class Main {
	public static void main (String[] args){
		Scanner scanner = new Scanner(System.in);
		List<Integer> scores = new ArrayList<>(); //ArrayList方法参考菜鸟教程
		int score = 0;
		System.out.println("请输入学生成绩(输入-1结束):");	//1 2 3 4 5 6 7 8 9 10
		try{
			while(true) {
				score = scanner.nextInt();
				if (score == -1)
					break;
				scores.add(score);
			}
			if (scores.size() < 10) {
				throw new InsufficientScoresException("成绩数目不足,至少需要10个成绩。");
			}
			scores.sort(Comparator.reverseOrder());	//菜鸟教程:sort() 方法根据指定的顺序对动态数组中的元素进行排序。
			System.out.println("成绩从高到低排序结果:");
			for (int i : scores) {
				System.out.print(i + " ");
			}
			System.out.println();
		} catch (InputMismatchException e) {
			System.out.println("请输入整数成绩");
		} catch (InsufficientScoresException e) {
			System.out.println(e.getMessage());
		} finally {
			System.out.println("你已输入" + scores.size() + "名学生的成绩。");
		}		
	}
}

测试 

测试1

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

测试2

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

测试3

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网易云热评加密函数逆向(Jsrpc)

今天给大家来个jsrpc实战教程,让大家继续加深对jsrpc的理解和认识。 1、因为网易云音乐热评的加密并不在cookie上,而是参数加密,所以这里就不需要进行hook住cookie了。 2、之前就知道网易云音乐热评的加密存在之地是在下图的位置,是那个函数window.asrsea(JSON.stringify(…

项目实战 | 责任链模式 (下)

案例二&#xff1a;工作流&#xff0c;费用报销审核流程 同事小贾最近刚出差回来&#xff0c;她迫不及待的就提交了费用报销的流程。根据金额不同&#xff0c;分为以下几种审核流程。报销金额低于1000元&#xff0c;三级部门管理者审批即可&#xff0c;1000到5000元除了三级部…

免费分享一套SpringBoot+Vue家政服务管理平台管理系统,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue家政服务管理平台管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue家政服务管理平台系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue家政服务管理平台系统 Ja…

coverage,一个有趣的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - coveragepy。 Github地址&#xff1a;https://github.com/nedbat/coveragepy 在软件开发中&#xff0c;测试是确保代码质量和稳定性的关键步骤之一。而代码覆盖率则是衡量…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络&#xff0c;众生皆叹难理解。 却见老师神乎其技&#xff0c;网络通畅如云烟。 协议层次纷繁复杂&#xff0c;ARP、IP、TCP、UDP。 路由器交换机相连&#xff0c;数据包穿梭无限。 网络安全重于泰山&#xff0c;防火墙、加密都来添。 恶意攻击时刻存在&#xf…

深圳证券交易所Binary行情数据接口规范

对接深圳证券交易所Binary行情数据接口其实并不难&#xff0c;你需要具备以下知识。 1、需要了解Binary报文设计结构&#xff0c;消息头消息体消息尾。 消息体&#xff1a; 如果是纯map结构的比较简单&#xff0c;字段平铺开来即可。如{"id":"1","…

与AI对话:探索最佳国内可用的ChatGPT网站

与AI对话&#xff1a;探索最佳国内可用的ChatGPT网站 &#x1f310; 链接&#xff1a; GPTGod 点击可注册 &#x1f3f7;️ 标签&#xff1a; GPT-4 支持API 支持绘图 Claude &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&…

多线程(安全 同步 线程池)

线程安全问题 多线程给我们的程序带来了很大性能上的提升&#xff0c;但是也可能引发线程安全问题线程安全问题指的是当多个线程同时操作同一个共享资源的时候&#xff0c;可能会出现的操作结果不符预期问题 取钱的线程安全问题 线程安全问题出现的原因&#xff1f; 存在多线…

idea创建完项目如何隐藏不重要的文件

如果您不打算直接使用这些脚本&#xff0c;而是更倾向于通过IDEA的内置工具来运行Maven命令&#xff0c;那么您可以选择隐藏这些文件。但是&#xff0c;隐藏这些文件并不会影响它们的功能&#xff0c;只是在项目视图中不再显示它们。 1.转到 File > Settings&#xff08;Wi…

时间,空间复杂度讲解——夯实根基

前言&#xff1a;本节内容属于数据结构的入门知识——算法的时间复杂度和空间复杂度。 时间复杂度和空间复杂度的知识点很少&#xff0c; 也很简单。 本节的主要篇幅会放在使用具体例题来分析时间复杂度和空间复杂度。本节内容适合刚刚接触数据结构或者基础有些薄弱的友友们哦。…

【threejs教程7】threejs聚光灯、摄影机灯和汽车运动效果

【图片完整效果代码位于文章末】 在上一篇文章中我们实现了汽车模型的加载&#xff0c;这篇文章主要讲如何让汽车看起来像在运动。同时列出聚光灯和摄像机灯光的加载方法。 查看上一篇&#x1f449;【threejs教程6】threejs加载glb模型文件&#xff08;小米su7&#xff09;&…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一&#xff0c;他可以保证在整个应用中&#xff0c;某个类只存在一个实例化对象&#xff0c;即全局使用到该类的只有一个对象&#xff0c;这种模式在需要限制某些类的实例数量时非常有用&#xff0c;通常全局…

The Clock and the Pizza [NeurIPS 2023 oral]

本篇文章发表于NeurIPS 2023 (oral)&#xff0c;作者来自于MIT。 文章链接&#xff1a;https://arxiv.org/abs/2306.17844 一、概述 目前&#xff0c;多模态大语言模型的出现为人工智能带来新一轮发展&#xff0c;相关理论也逐渐从纸面走向现实&#xff0c;影响着人们日常生活…

WebAssembly学习记录

1.WebAssembly 1.1 指令集 概念&#xff1a;二进制编码集合。 依据计算机组成原理和计算机概论&#xff0c;指令集是一组二进制编码。 作用&#xff1a;控制硬件。 这些二进制指令直接作用于硬件电路&#xff0c;控制硬件完成指定操作。 例如&#xff1a;控制数据进入某个寄存…

如何通过质构分析仪客观评价面包的硬度、咀嚼性等口感指标

如何通过质构分析仪客观评价面包的硬度、咀嚼性等口感指标 一、引言&#xff1a;面包口感品质的重要性 面包作为日常生活中常见的食品之一&#xff0c;其口感品质直接影响到消费者的购买决策和食用体验。其中&#xff0c;硬度和咀嚼性是衡量面包口感品质的重要指标。因此&…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言&#xff1a;数据正作为重点&#xff0c;为行业提供不可或缺的指导 《汽车数据发展研究报告&#xff08;2023&#xff09;》指出&#xff0c;汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测&#xff0c;到 2025 年&#xff0c;汽车行业 20%的利…

小程序AI智能名片S2B2C商城系统:四大主流商业模式深度解析与实战案例分享

在私域电商迅速崛起的大背景下&#xff0c;小程序AI智能名片S2B2C商城系统以其独特的商业模式和强大的功能&#xff0c;正成为品牌商们争相探索的新领域。在这一系统中&#xff0c;拼团模式、会员电商、社区团购和KOC营销等四种主流模式&#xff0c;为品牌商提供了多样化的营销…

深度探讨容器化技术在网络安全中的应用与挑战

随着容器化技术的快速发展&#xff0c;尤其是Docker与Kubernetes&#xff08;K8s&#xff09;的广泛应用&#xff0c;企业IT架构正经历着从传统虚拟机向轻量级容器的深刻变革。容器化技术为提升资源利用率、加速应用部署及维护提供了强大支持&#xff0c;但同时也给网络安全带来…

bugfix: com.alibaba.druid.sql.parser.EOFParserException: EOF

前言 在日常的开发工作中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;其中涉及数据库操作的接口联调尤其容易出现意想不到的状况。今天我就遇到了一个关于Druid SQL解析异常的问题&#xff0c;具体表现为com.alibaba.druid.sql.parser.EOFParserException: EOF。通过…

42. UE5 RPG 实现火球术伤害

上一篇&#xff0c;我们解决了火球术于物体碰撞的问题&#xff0c;现在火球术能够正确的和攻击目标产生碰撞。接下来&#xff0c;我们要实现火球术的伤害功能&#xff0c;在火球术击中目标后&#xff0c;给目标造成伤害。 实现伤害功能的思路是给技能一个GameplayEffect&#x…