今天写一个简单的异常处理的方法,题目贴到下面。

本文通过一个简单的Circle类实现,展示了如何在Java中使用异常处理来验证用户输入的有效性。当用户输入负数作为圆的半径时,程序将抛出异常并提示错误。

分析:首先先写一个Circle类,包含所需要的信息,这个就不多说了,主要就是后面要求的异常处理,如果半径小于0就要提醒用户输入出错,并终止程序,这时就要用到  throw  new  Exception();  throw总是出现在函数体中,用来抛出throwable类型的异常,执行完throw之后程序会终止不再继续执行下去,也就是说他后面的语句都不再执行。下面看一下代码。

Circle类:package homework;


import java.util.Scanner;


public class Circle {

double R;
static double PI=3.14;

public double getR() {
return R;
}
public  double setR(double r) {
return r;
}


public Circle() {
super();
// TODO Auto-generated constructor stub

}


//求圆的周长
public void Perimeter(double R) {
System.out.println("输出圆的周长为:"+2*PI*R);
}

//求圆的面积
public  void Areas(double R) {
System.out.println("输出圆的面积是:"+PI*R*R);
}

}

测试类TestCircle类:

package homework;


import java.util.Scanner;


public class TestCircle {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub

Circle p=new Circle();//创建对象


System.out.println("输入圆的半径:");
Scanner scan=new Scanner(System.in);

double r=p.setR(scan.nextDouble());


if(r<0)

throw new Exception("输入的值不能为负!");


if(r>=0) {
p.Perimeter(r);//输出圆的周长
p.Areas(r);//输出圆的面积
}

}
}

输入负数的运行结果:


输入正数的运行结果:



over!就是这酱紫了,是不是其实并不是很难,只要知道异常抛出的方法,中间再做一个判断就OK了。
<think> 我们有一个明确的任务:编名为test9的shell脚本,实现以下功能: 1. 创建一个名为class1的新组 2. 添加30个用户,用户名从std01到std30,这些用户都属于class1组 步骤: 1. 创建组:使用`groupadd`命令创建class1组。 2. 循环创建用户:使用`useradd`命令,并指定附加组为class1(使用-G选项)。注意,用户名按两位数编号:std01, std02, ..., std30。 3. 设置初始密码:根据引用[2],我们可以使用`echo 密码 | passwd --stdin 用户名`来设置密码。但注意,passwd命令使用--stdin选项可能需要sudo权限,且在一些系统中(如Debian/Ubuntu)passwd可能不支持--stdin选项(可以使用chpasswd代替)。不过,根据引用,我们得知这种方法在支持--stdin的系统(如CentOS)中有效。 考虑到可移植性,这里可以使用两种方式: - 如果支持`passwd --stdin`,则用此方式。 - 否则,使用`chpasswd`(需要将用户名密码用冒号分隔,然后通过管道传递给chpasswd)。 但题目没有要求密码,通常我们可以设置一个初始密码,比如与用户名相同,或者设置一个统一密码(例如123456)。但实际生产环境中,应该设置强密码或让用户首次登录修改密码。 根据题目,我们只需要创建用户并加入组,没有指定密码,我们可以设置一个默认密码,例如设置为“123456”或者要求用户第一次登录修改密码。这里为了简单,我们将密码设置为与用户名相同(例如std01的密码为std01)?或者统一设置为一个密码?题目未说明,我们可以统一设置为123456。 注意:需要root权限执行此脚本。 另外,在创建用户时,我们可以指定用户的组。这里我们使用附加组(-G class1)的方式,同时用户的主组可能是新创建的同名组。但我们希望用户的主组也是class1?题目要求属于该组,但并没有说明是主组还是附加组。通常我们可以设置主组为class1(使用-g选项),也可以只作为附加组。 根据需求:“添加30个属于该组的用户”,我们可以将class1作为用户的主组(这样每个用户的主组都是class1)或者附加组。通常,如果这个组是用户的主要组,那么设置为用户的主组(-g class1)更合适。 所以,我们可以这样: - 创建用户时使用:`useradd -m -g class1 -s /bin/bash stdXX` - `-m`:创建用户的家目录 - `-g class1`:指定主组为class1 - `-s /bin/bash`:指定登录shell 但是题目没有要求创建家目录?不过通常都会创建。题目也没有指定shell,但一般指定bash比较常见。 我们按照常规做法:创建家目录,指定shell为bash。 步骤总结: 1. 创建组class1(如果已存在,可能会报错,但题目要求创建,所以先检查?或者直接创建,如果已存在则忽略错误?或者先检查是否存在,存在则跳过,不存在则创建) 2. 循环创建30个用户,指定主组为class1,并设置密码。 关于密码设置,我们使用统一初始密码"123456",并强制用户第一次登录时修改密码(使用`passwd -e 用户名`,让密码立即过期,用户第一次登录时强制修改密码)。这样可以增加安全性。 或者,我们不设置密码(但这样用户不能登录),所以必须设置初始密码。使用`passwd`设置后立即过期。 具体步骤: - 创建组:`groupadd class1`(如果组已经存在,脚本会报错,我们可以忽略错误或者先检查。为了简单,我们可以在创建组时忽略错误(使用`groupadd -f class1`),这样如果组存在也不会报错,而是成功退出)。 - 循环:for循环,从1到30,注意编号为两位数(01,02,...,30)。 创建用户时,使用`useradd`命令,并设置初始密码,然后让密码过期。 但是,在脚本中连续设置密码可能需要sudo权限,并且如果密码过于简单,在有些系统上可能不被接受(需要修改密码复杂性策略)。这里假设为实验环境,我们可以接受简单密码。 因此,脚本test9的内容如下: 注意:需要以root用户执行。 我们编脚本: ```bash #!/bin/bash # 创建class1组,如果已存在则忽略 groupadd -f class1 # 循环创建30个用户 for i in {1..30} do # 格式化用户名,两位数,不足两位前面补0 username=$(printf "std%02d" $i) # 创建用户,指定主组为class1,并创建家目录,设置shell为/bin/bash useradd -m -g class1 -s /bin/bash $username # 设置密码为"123456" echo "$username:123456" | chpasswd # 设置密码过期,使用户第一次登录时修改密码 passwd -e $username >/dev/null done echo "用户创建完成。" ``` 另一种设置密码的方式(如果支持passwd --stdin): echo "123456" | passwd --stdin $username 但是,chpasswd更通用(在DebianCentOS都可用),并且不需要交互。 使用`chpasswd`方法:将用户名密码用冒号分隔,然后通过管道传递给chpasswd命令。 另外,`passwd -e`(立即过期)在用户第一次登录时会强制修改密码。 但是,注意:`chpasswd`命令需要root权限,我们已经在root下运行脚本。 关于权限:题目没有要求设置每个用户的家目录权限,但是引用[1]中提到了设置目录权限,不过那是另一个题目。本题只要求创建组用户,且用户属于class1组。 因此,我们不需要额外设置家目录权限(除非题目有要求)。本题没有要求。 所以,我们按照上述脚本即可。 注意:循环中,我们使用`printf "std%02d" $i`来生成01到30的格式。 测试:在Linux系统中,以root用户身份运行此脚本。 但是,如果在非root用户下运行,需要sudo权限,但脚本中没有使用sudo(因为预期是root执行)。如果没有root权限,可以在命令前加sudo,或者在脚本开头检查用户是否为root。 改进:检查执行脚本的用户是否为root,如果不是,提示并退出。 因此,我们可以在脚本开头添加检查: ```bash if [ "$(id -u)" != "0" ]; then echo "此脚本必须由root用户执行" 1>&2 exit 1 fi ``` 完整的脚本如下: </think> 下面一个实现您需求的Shell脚本`test9`,它将创建`class1`组并添加30个用户(std01-std30),所有用户均属于该组: ```bash #!/bin/bash # 脚本名:test9 # 功能:创建class1组30个用户(std01-std30) # 检查root权限 if [ "$(id -u)" != "0" ]; then echo "错误:此脚本必须由root用户执行" >&2 exit 1 fi # 创建class1组(如果不存在) getent group class1 &>/dev/null if [ $? -eq 0 ]; then echo "警告:class1组已存在" else groupadd class1 echo "class1组创建成功" fi # 创建30个用户 for i in {1..30}; do username=$(printf "std%02d" $i) # 生成std01-std30格式用户名 # 检查用户是否存在 if id "$username" &>/dev/null; then echo "用户 $username 已存在,跳过" continue fi # 创建用户并设置主组 useradd -m -g class1 "$username" # 设置初始密码(密码=用户名) echo "$username:$username" | chpasswd echo "用户 $username 创建完成" done echo "所有用户已成功添加至class1组" ``` ### 功能说明: 1. **权限检查** 脚本开头验证执行者是否为root用户(必需的系统管理权限) 2. **组创建** 使用`groupadd class1`创建组(自动跳过已存在的组) 3. **用户创建** - 循环生成`std01`到`std30`格式的用户名 - `useradd -m -g class1`: - `-m` 创建用户家目录 - `-g class1` 设置主组为class1 - 初始密码设置为与用户名相同(通过管道使用`chpasswd`安全设置密码)[^2] 4. **异常处理** - 自动跳过已存在的用户组 - 格式化输出执行状态 ### 使用步骤: 1. 创建脚本文件: ```bash sudo nano test9 ``` 2. 粘贴上述代码后保存(`Ctrl+X` → `Y` → `Enter`) 3. 赋予执行权限: ```bash sudo chmod +x test9 ``` 4. 执行脚本: ```bash sudo ./test9 ``` ### 验证结果: ```bash # 检查组是否存在 getent group class1 # 检查用户信息(示例) id std01 # 输出应包含:uid=xxx(std01) gid=yyy(class1) groups=class1 # 检查家目录权限 ls -ld /home/std01 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值