Introduction to Java Programming编程题12.1<NumberFormatException>

运行结果:

br:javacode br$ javac NumberFormatException.java
br:javacode br$ java NumberFormatException 45 34
Please use java NumberFormatException operand1 operator operand2
java NumberFormatException 45x + 34
Wrong input 45x
java NumberFormatException 45 1 33
Wrong input: 1
java NumberFormatException 45 / 3
45 / 3 = 15.0

NumberFormatException.java (不使用异常处理)


class NumberFormatException {
    public static void main(String[] args) {
        if (args.length != 3) {
            System.out.println("Please use java NumberFormatException operand1 operator operand2");
            System.exit(1);
        }

        if (isDigital(args[0])) {
            if (args[1].length() == 1) {
                if (args[1].charAt(0) == '+' || args[1].charAt(0) == '-'
                        || args[1].charAt(0) == '*' || args[1].charAt(0) == '/') {
                    if (isDigital(args[2])) {
                        char operator = args[1].charAt(0);
                        double result = 0;
                        switch (operator) {
                            case '+':
                                result = Integer.parseInt(args[0]) + Integer.parseInt(args[2]);
                                break;
                            case '-':
                                result = Integer.parseInt(args[0]) - Integer.parseInt(args[2]);
                                break;
                            case '*':
                                result = Integer.parseInt(args[0]) * Integer.parseInt(args[2]);
                                break;
                            case '/':
                                result = Integer.parseInt(args[0]) / Integer.parseInt(args[2]);
                                break;
                        }
                        System.out.println(args[0] + ' ' + args[1] + ' ' + args[2] + " = " + result);
                        System.exit(0);
                    }
                } else
                    System.out.println("Wrong input: " + args[1]);
            } else
                System.out.println("Wrong input: " + args[1]);
        }

        System.exit(1);
    }

    public static boolean isDigital(String args) {
        for (int i = 0; i < args.length(); i++)
            if (!Character.isDigit(args.charAt(i))) {
                System.out.println("Wrong input " + args);
                return false;
            }

        return true;
    }


}

NumberFormatException1.java (使用异常处理)

class NumberFormatException1 {
    public static void main(String[] args) {

      try {
        if (args.length != 3)
            throw new IllegalArgumentException ("Please use java NumberFormatExceptionX operand1 operator operand2");

        if (isDigital(args[0])) {
            if (args[1].length() == 1) {
                if (args[1].charAt(0) == '+' || args[1].charAt(0) == '-'
                        || args[1].charAt(0) == '*' || args[1].charAt(0) == '/') {
                    if (isDigital(args[2])) {
                        char operator = args[1].charAt(0);
                        double result = 0;
                        switch (operator) {
                            case '+':
                                result = Integer.parseInt(args[0]) + Integer.parseInt(args[2]);
                                break;
                            case '-':
                                result = Integer.parseInt(args[0]) - Integer.parseInt(args[2]);
                                break;
                            case '*':
                                result = Integer.parseInt(args[0]) * Integer.parseInt(args[2]);
                                break;
                            case '/':
                                result = Integer.parseInt(args[0]) / Integer.parseInt(args[2]);
                                break;
                        }
                        System.out.println(args[0] + ' ' + args[1] + ' ' + args[2] + " = " + result);
                    }
                }
            }
        }
      }
      catch (IllegalArgumentException e) {
        System.out.println(e);
      }

    }

    public static boolean isDigital(String args) {
        for (int i = 0; i < args.length(); i++)
            if (!Character.isDigit(args.charAt(i)))
                return false;

        return true;
    }


}
This book is a brief version of Introduction to Java Programming, Comprehensive Version, 8E. This version is designed for an introductory programming course, commonly known as CS1. This version contains the first twenty chapters in the comprehensive version. This book uses the fundamentals-first approach and teaches programming concepts and techniques in a problem-driven way. The fundamentals-first approach introduces basic programming concepts and techniques before objects and classes. My own experience, confirmed by the experiences of many colleagues, demonstrates that new programmers in order to succeed must learn basic logic and fundamental programming techniques such as loops and stepwise refinement. The fundamental concepts and techniques of loops, methods, and arrays are the foundation for programming. Building the foundation prepares students to learn object-oriented programming, GUI, database, and Web programming. Problem-driven means focused on problem-solving rather than syntax. We make introductory programming interesting by using interesting problems. The central thread of this book is on solving problems. Appropriate syntax and library are introduced to support the writing of a program for solving the problems. To support teaching programming in a problemdriven way, the book provides a wide variety of problems at various levels of difficulty to motivate students. In order to appeal to students in all majors, the problems cover many application areas in math, science, business, financials, gaming, animation, and multimedia. 精美文字版pdf电子书。
本书是Java语言的经典教材,中文版分为基础篇和进阶篇,主要介绍程序设计基础、面向对象编程、GUI程序设计、数据结构和算法、高级Java程序设计等内容。本书以示例讲解解决问题的技巧,提供大量的程序清单,每章配有大量复习题和编程练习题,帮助读者掌握编程技术,并应用所学技术解决实际应用开发中遇到的问题。您手中的这本是其中的基础篇,主要介绍了基本程序设计、语法结构、面向对象程序设计、继承和多态、异常处理和文本I/O、抽象类和接口等内容。本书可作为高等院校程序设计相关专业的基础教材,也可作为Java语言及编程开发爱好者的参考资料。 作者:(美国)粱勇(Y.Daniel Liang) 译者:戴开宇 梁勇(Y.Daniel Liang),现为阿姆斯特朗亚特兰大州立大学计算机科学系教授。之前曾是普度大学计算机科学系副教授。并两次获得普度大学杰出研究奖。他所编写的Java教程在美国大学Java课程中采用率极高。同时他还兼任Prentice Hall Java系列丛书的编辑。他是“Java Champion”荣誉得主,并在世界各地为在校学生和程序员做JAVA程序设计方法及技术方面的讲座。 戴开宇,复旦大学软件学院教师,工程硕士导师。中国计算机学会会员。博士毕业于上海交通大学计算机应用专业,20112012年在美国佛罗里达大学作访问学者。承担多门本科专业课程、通识教育课程以及工程硕士课程,这些课程被评为校精品课程,上海市重点建设课程,IBM—教育部精品课程等。
<think>我们要将List<String>转换为List<Long>,这意味着我们需要将每个字符串元素转换为Long类型。 在Java中,我们可以使用流(Stream)操作来实现这一转换。需要注意的是,转换过程中可能会遇到格式不正确的字符串(无法解析为Long),我们需要考虑异常处理。 通常,我们可以选择跳过无法转换的元素,或者抛出异常。这里我们给出两种常见方式: 方式1:使用流(Stream)的map函数,并在转换过程中捕获异常(但注意:在lambda表达式中处理异常不太直接,通常需要额外处理) 方式2:使用流并使用方法引用,但前提是确保所有字符串都能正确转换,否则使用mapToLong等会抛出异常。 更常见的是,我们可能会过滤掉无法转换的字符串,或者使用一个辅助方法处理异常。 这里我们展示两种方法: 方法A:跳过无法转换的元素(使用filter和map,但注意:在map中如果遇到异常,我们无法直接抛出,所以可以写一个辅助方法,或者使用Optional) 方法B:如果确定所有字符串都能转换,可以直接使用map。 但是,由于在lambda表达式中不能直接抛出受检异常,我们可以使用Apache Commons Lang的NumberUtils(如果项目允许)或者自己写一个工具方法。 不过,我们也可以使用Java 8的try-catch在lambda中,但代码会显得冗长。这里我们使用一个简单的例子,假设我们想跳过无法转换的字符串: 步骤: 1. 创建流:list.stream() 2. 使用mapToLong尝试将每个字符串转换为long,但这里mapToLong会抛出NumberFormatException,我们可以用try-catch在lambda内,但这样代码不美观。 3. 另一种方式是使用一个方法,将字符串转换为Long,如果转换失败返回null,然后过滤掉null。但是注意,mapToLong需要的是long原始类型,所以我们可以用map(得到Long对象)然后过滤null。 示例代码(方法A:跳过无法转换的元素): ```java List<Long> longList = stringList.stream() .map(s -> { try { return Long.valueOf(s); } catch (NumberFormatException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toList()); ``` 但是,上面的方法会返回一个List<Long>,其中跳过了所有无法转换的字符串。 方法B:如果转换失败抛出异常(终止处理): 我们可以使用forEach并在转换过程中抛出异常,但这样无法在流中直接完成。我们可以使用一个收集器,在转换过程中遇到异常就抛出,但这样并不直接。 另一种方式:使用for循环,但题目要求使用Java,且没有特别要求,我们通常使用流。 实际上,如果希望一旦有错误就抛出异常,我们可以这样写: ```java List<Long> longList = stringList.stream() .map(Long::valueOf) // 这里如果有一个字符串无法转换,就会抛出NumberFormatException .collect(Collectors.toList()); ``` 但是,这种方式会在遇到第一个无法转换的字符串时抛出异常,并且不会继续处理。如果我们希望收集所有转换成功的,但遇到错误时继续处理(不抛出异常)就用方法A。 因此,根据需求选择。 另外,如果字符串列表很大,我们还可以使用并行流来提高性能,但要注意转换操作是否是线程安全的(Long.valueOf是线程安全的)。 总结:根据实际需求,如果希望跳过错误格式的字符串,使用第一种方法;如果确定所有字符串都能转换,或者不能转换时希望抛出异常,使用第二种方法。 注意:在方法A中,我们使用了try-catch返回null然后过滤,这样会保留所有能转换的,跳过不能转换的。 现在,我们给出完整的示例代码(方法A): ```java import java.util.List; import java.util.Objects; import java.util.stream.Collectors; public class ListConverter { public static List<Long> convertStringListToLongList(List<String> stringList) { return stringList.stream() .map(s -> { try { return Long.valueOf(s); } catch (NumberFormatException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toList()); } } ``` 如果使用Java 16及以上,我们可以使用mapMulti来避免中间产生null(但处理异常的方式类似): ```java List<Long> longList = stringList.stream() .mapMulti((s, consumer) -> { try { consumer.accept(Long.valueOf(s)); } catch (NumberFormatException ignored) { } }) .collect(Collectors.toList()); ``` 但是,mapMulti需要类型为BiConsumer,并且需要指定类型,所以可以这样写: ```java List<Long> longList = stringList.stream() .<Long>mapMulti((s, consumer) -> { try { consumer.accept(Long.parseLong(s)); } catch (NumberFormatException ignored) { } }) .collect(Collectors.toList()); ``` 以上是几种转换方式。 根据问题,我们回答完毕,然后需要提出3-5个相关问题。</think>在Java中,将`List<String>`转换为`List<Long>`需要通过流(Stream)操作逐个转换元素。以下是完整实现代码: ```java import java.util.List; import java.util.stream.Collectors; public class ListConverter { public static List<Long> convertStringListToLongList(List<String> stringList) { return stringList.stream() .map(Long::parseLong) // 将每个字符串解析为Long .collect(Collectors.toList()); // 收集为新的List } } ``` ### 使用说明: 1. **核心方法**:`Long.parseLong()` 将字符串转为基本类型`long`(自动装箱为`Long`对象) 2. **流处理**:使用`stream().map()`进行元素级转换 3. **异常处理**:如果字符串包含非数字内容(如`"abc"`),会抛出`NumberFormatException`,建议添加校验逻辑 ### 处理非法数据的改进版: ```java public static List<Long> safeConvert(List<String> stringList) { return stringList.stream() .filter(s -> s.matches("-?\\d+")) // 预过滤数字格式 .map(Long::valueOf) .collect(Collectors.toList()); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值