学习日志07 java

1 Integer.parseInt

Integer.parseInt() 是 Java 中的一个静态方法,它属于 java.lang.Integer 类。这个方法的主要作用是将字符串类型的数据转换为 int 类型的整数。下面为你详细介绍:

方法定义

Integer.parseInt() 方法有两个重载形式:

  1. public static int parseInt(String s):将字符串参数解析为有符号的十进制整数。字符串中的字符必须都是十进制数字,除了第一个字符可以是 ASCII 减号 - ('\u002D')来表示负数。
  2. public static int parseInt(String s, int radix):将字符串参数解析为第二个参数指定进制的有符号整数。例如,radix 为 2 时表示按二进制解析,为 16 时表示按十六进制解析。

使用示例

1. parseInt(String s) 示例

java

public class ParseIntExample {
    public static void main(String[] args) {
        String numberStr = "123";
        // 将字符串 "123" 转换为 int 类型的整数
        int number = Integer.parseInt(numberStr);
        System.out.println("转换后的整数: " + number);

        // 处理负数情况
        String negativeStr = "-456";
        int negativeNumber = Integer.parseInt(negativeStr);
        System.out.println("转换后的负数: " + negativeNumber);
    }
}

在上述代码中,Integer.parseInt("123") 将字符串 "123" 转换为整数 123Integer.parseInt("-456") 将字符串 "-456" 转换为整数 -456

2. parseInt(String s, int radix) 示例

java

public class ParseIntRadixExample {
    public static void main(String[] args) {
        String binaryStr = "1010";
        // 将二进制字符串 "1010" 转换为十进制整数
        int decimalNumber = Integer.parseInt(binaryStr, 2);
        System.out.println("二进制字符串转换后的十进制整数: " + decimalNumber);

        String hexStr = "FF";
        // 将十六进制字符串 "FF" 转换为十进制整数
        int hexToDecimal = Integer.parseInt(hexStr, 16);
        System.out.println("十六进制字符串转换后的十进制整数: " + hexToDecimal);
    }
}

在这个示例中,Integer.parseInt("1010", 2) 把二进制字符串 "1010" 转换为十进制整数 10Integer.parseInt("FF", 16) 把十六进制字符串 "FF" 转换为十进制整数 255

异常情况

如果传入的字符串不能被正确解析为整数,Integer.parseInt() 方法会抛出 NumberFormatException 异常。例如:

java

public class ParseIntExceptionExample {
    public static void main(String[] args) {
        try {
            String invalidStr = "abc";
            int result = Integer.parseInt(invalidStr);
            System.out.println(result);
        } catch (NumberFormatException e) {
            System.out.println("输入的字符串不能转换为整数: " + e.getMessage());
        }
    }
}

在这个例子中,由于字符串 "abc" 不能被解析为整数,Integer.parseInt(invalidStr) 会抛出 NumberFormatException 异常,程序会捕获该异常并输出相应的错误信息。

在你的代码中的作用

在你之前提供的代码里,Integer.parseInt(parts[1]) 的作用是把从输入中分割得到的年龄字符串(如 "6""8")转换为 int 类型的整数,这样就能将其赋值给 Student 对象的 age 属性了。例如:

java

String[] parts = line.split(" ");
// parts[1] 是年龄字符串,将其转换为 int 类型
int age = Integer.parseInt(parts[1]);

2 我的代码和优雅的代码答案 

我写的:

package PTA_training.Demo3_1;
/*
7-1 学生类设计
设计一个类Student,并在Main类中生成Student类对象进行测试
1.对于Student类,设计私有属性name和age,
并为每一个成员变量name和age设计其setXXX()和getXXX()方法,
并对于setAge方法,如果age被赋值为<=6,则age值为7,其他为参数值。
2.对于Student类,设计无参构造方法,在构造方法中为age赋值为7,name赋值为“无名"
并添加语句System.out.println("无参构造方法");
3.设计方法public void display(),方法中显示该学生的姓名和年龄,显示格式为name:无名,age:8
Main类的main方法中,创建1个学生对象,然后调用display方法显示学生信息,
接着通过键盘输入1个学生的姓名和年龄,调用display方法去显示学生信息。
输入格式:
在一行内输入学生的姓名和年龄
输出格式:
对每一组输入,输出学生的姓名和年龄。
输入样例:
在这里给出一组输入。例如:
tom 6
jerry 8
输出样例:
在这里给出相应的输出。例如:
无参构造方法
name:无名,age:7
name:tom,age:7
无参构造方法
name:无名,age:7
name:jerry,age:8
 */
public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age <= 6){
        this.age = 7;}
        else
        {this.age= age;}
    }

    public void setName(String name) {
        this.name = name;
    }
    public Student(){
        System.out.println("无参构造方法");
        this.name = "无名";
        this.age = 7;
    }
    public void display()
    {
        System.out.println("name:"+name+",age:"+age);
    }
}
package PTA_training.Demo3_1;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);

        while(scanner.hasNextLine()){
            Student stu= new Student();
            String name = scanner.next();
            int age = scanner.nextInt();
            stu.setName(name);
            stu.setAge(age);
            stu.display();

        }
        scanner.close();
    }

}

ai提供的优雅的代码:

package PTA_training.Demo3_1;

/**
 * 学生类,包含学生的姓名和年龄信息。
 */
public class Student {
    private String name;
    private int age;

    /**
     * 获取学生的姓名。
     * @return 学生的姓名
     */
    public String getName() {
        return name;
    }

    /**
     * 获取学生的年龄。
     * @return 学生的年龄
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置学生的年龄,如果年龄小于等于 6,则将年龄设置为 7。
     * @param age 要设置的年龄
     */
    public void setAge(int age) {
        this.age = age <= 6 ? 7 : age;
    }

    /**
     * 设置学生的姓名。
     * @param name 要设置的姓名
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 无参构造方法,初始化学生的姓名为“无名”,年龄为 7,并输出提示信息。
     */
    public Student() {
        System.out.println("无参构造方法");
        this.name = "无名";
        this.age = 7;
        display();
    }

    /**
     * 显示学生的姓名和年龄。
     */
    public void display() {
        System.out.println(String.format("name:%s,age:%d", name, age));
    }
}
package PTA_training.Demo3_1;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()) {
            Student stu = new Student();
            String input = scanner.nextLine();
            String[] parts = input.split(" ");
            if (parts.length == 2) {
                try {
                    String name = parts[0];
                    int age = Integer.parseInt(parts[1]);
                    stu.setName(name);
                    stu.setAge(age);
                    stu.display();
                } catch (NumberFormatException e) {
                    System.out.println("输入的年龄不是有效的整数,请重新输入。");
                }
            } else {
                System.out.println("输入格式错误,请输入姓名和年龄,用空格分隔。");
            }
        }
        scanner.close();
    }
}

 

对比

原代码
  • 输入处理:使用 scanner.next() 和 scanner.nextInt() 可能会导致输入不匹配问题。
  • 异常处理:没有对输入不合法的情况进行处理。
  • 代码风格:setAge 方法使用 if-else 语句,display 方法直接拼接字符串。
改进后的代码
  • 输入处理:使用 scanner.nextLine() 读取整行输入,然后进行解析,避免了输入不匹配问题。
  • 异常处理:添加了 try-catch 块,对输入的年龄不是有效整数的情况进行处理。
  • 代码风格:setAge 方法使用三元运算符简化代码,display 方法使用 String.format 方法使输出格式更清晰。

知识点

1. JavaDoc 注释

JavaDoc 注释用于为类、方法和字段提供文档说明,方便其他开发者理解代码的用途和使用方法。

2. 输入处理

Scanner 类用于读取用户输入,scanner.nextLine() 可以读取整行输入,String.split() 方法可以将字符串按指定分隔符分割成数组。

3. 异常处理

try-catch 块用于捕获和处理异常,NumberFormatException 是一个运行时异常,当尝试将一个非数字字符串转换为数字时会抛出该异常。

4. 代码风格

三元运算符 condition ? value1 : value2 可以简化 if-else 语句,String.format 方法可以格式化字符串,使代码更易读。

3 @param name这个doc不写会怎么样

在 Java 中,@param 是 JavaDoc 注释的一部分,用于为方法的参数提供文档说明。如果不写 @param name 这样的注释,会产生以下几方面的影响:

对代码功能的影响

从代码的实际运行和功能实现角度来看,不写 @param 注释不会对代码的执行产生任何影响。代码的逻辑和功能不会因为缺少注释而改变,Student 类的 setName 方法依然能够正常设置学生的姓名,Main 类中的代码也能正常创建 Student 对象、读取输入并调用相应方法。

对代码可维护性和可读性的影响

  • 降低代码的可读性:其他开发者在阅读代码时,无法直接从文档中了解方法参数的含义和用途。例如,在 Student 类的 setName 方法中,如果没有 @param name 注释,新的开发者可能不清楚传入的 name 参数具体代表什么,尤其是在复杂的项目中,方法参数较多时,这种情况会更加明显。
  • 增加理解成本:没有 @param 注释,开发者需要通过阅读方法的具体实现来推断参数的用途,这会增加理解代码的时间和成本。例如,在阅读 setAge 方法时,如果没有注释说明参数 age 的含义,开发者需要查看方法内部的逻辑才能明白这个参数是用于设置学生年龄的。

对代码文档生成的影响

  • 缺少参数描述:当使用工具(如 Javadoc 工具)生成代码文档时,缺少 @param 注释会导致生成的文档中缺少对方法参数的描述。这会使得生成的文档不完整,其他开发者在查阅文档时无法获取关于方法参数的详细信息。

示例代码及注释对比

有 @param 注释的代码

java

/**
 * 设置学生的姓名。
 * @param name 要设置的姓名
 */
public void setName(String name) {
    this.name = name;
}
没有 @param 注释的代码

java

/**
 * 设置学生的姓名。
 */
public void setName(String name) {
    this.name = name;
}

学习建议

  • 养成写注释的好习惯:在编写代码时,尽量为每个方法的参数添加 @param 注释,为返回值添加 @return 注释,为可能抛出的异常添加 @throws 注释等。这样可以提高代码的可维护性和可读性。
  • 参考优秀代码:阅读开源项目和优秀的代码示例,学习其他开发者如何编写规范的 JavaDoc 注释。
  • 使用工具生成文档:学会使用 Javadoc 等工具生成代码文档,确保生成的文档完整、准确,方便其他开发者查阅。

 4 对比,学习

你提供代码的优点

1. 功能完整性

代码实现了题目要求的所有功能。Student 类设计了私有属性 name 和 age,并为其提供了相应的 setter 和 getter 方法;实现了无参构造方法,在构造方法中初始化 name 为 “无名”,age 为 7,并输出提示信息;还设计了 display 方法用于显示学生信息。Main 类实现了从键盘读取学生姓名和年龄,创建 Student 对象并显示学生信息的功能。

2. 注释详细

代码中包含了详细的注释,对每个类和方法的功能进行了说明,方便其他开发者理解代码的用途和实现逻辑。

可改进之处及与更优雅代码的对比

1. 输入处理方面
  • 原代码

java

while(scanner.hasNextLine()){
    Student stu= new Student();
    String name = scanner.next();
    int age = scanner.nextInt();
    stu.setName(name);
    stu.setAge(age);
    stu.display();
}

使用 scanner.next() 和 scanner.nextInt() 分别读取姓名和年龄,这种方式可能会导致输入不匹配的问题,因为它们不会读取换行符,可能会影响后续输入。例如,如果用户输入包含空格或换行符,可能会出现意外的结果。

  • 改进后代码

java

while (scanner.hasNextLine()) {
    Student stu = new Student();
    String input = scanner.nextLine();
    String[] parts = input.split(" ");
    if (parts.length == 2) {
        try {
            String name = parts[0];
            int age = Integer.parseInt(parts[1]);
            stu.setName(name);
            stu.setAge(age);
            stu.display();
        } catch (NumberFormatException e) {
            System.out.println("输入的年龄不是有效的整数,请重新输入。");
        }
    } else {
        System.out.println("输入格式错误,请输入姓名和年龄,用空格分隔。");
    }
}

使用 scanner.nextLine() 读取整行输入,然后使用 split 方法将输入按空格分割成数组,再分别处理姓名和年龄。这样可以避免输入不匹配的问题,并且添加了异常处理,当输入的年龄不是有效的整数时,会给出相应的提示。

2. 代码风格方面
  • setAge 方法

java

public void setAge(int age) {
    if (age <= 6){
        this.age = 7;
    }
    else {
        this.age = age;
    }
}

使用 if-else 语句来判断年龄是否小于等于 6,逻辑较为清晰,但代码稍显冗长。

  • 改进后

java

public void setAge(int age) {
    this.age = age <= 6 ? 7 : age;
}

使用三元运算符简化了代码,使代码更加简洁易读。

3. display 方法方面
  • 原代码

java

public void display() {
    System.out.println("name:"+name+",age:"+age);
}

直接使用字符串拼接的方式输出学生信息,在处理复杂的字符串格式时可能会使代码变得混乱。

  • 改进后

java

public void display() {
    System.out.println(String.format("name:%s,age:%d", name, age));
}

使用 String.format 方法格式化输出字符串,使代码更清晰,也更容易修改输出格式。

4. JavaDoc 注释方面

原代码虽然有详细的注释说明功能,但没有使用规范的 JavaDoc 注释。规范的 JavaDoc 注释可以为类、方法和字段提供更详细的文档说明,方便其他开发者理解代码的用途和使用方法。例如,在 Student 类的方法中添加 @param 和 @return 等注释。

学习建议

  • 深入学习输入输出处理:了解 Scanner 类的各种方法的使用场景和区别,掌握如何处理不同类型的输入,以及如何处理输入异常。
  • 学习代码优化技巧:掌握三元运算符、String.format 等语法和方法,学会简化代码,提高代码的可读性和可维护性。
  • 规范注释习惯:养成使用 JavaDoc 注释的习惯,为类、方法和字段添加详细的文档说明,方便自己和他人理解代码。
  • 阅读优秀代码:阅读开源项目和优秀的代码示例,学习其他开发者的编程风格和技巧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值