记一次错误使用Integer.parseInt引起的bug

本文通过一个实例展示了在将手机号转换为int类型时遇到的NumberFormatException问题,原因是手机号值超过了Integer的最大值。解决方案是使用Long.parseLong进行转换。同时,文章还演示了一个验证示例,进一步说明了Integer与Long在处理大数值时的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次错误使用Integer.parseInt引起的bug

事情是这样的,原本呢,我需要将8位的渠道编码转换成int类型,但是我错误的将手机号转换成了int类型导致了报错。将代码简化之后其实就是下面的

package com.daylywork.study;

public class ZhuanHuan {
    public static void main(String[] args){
        String a="18233166440";
        System.out.println(Integer.parseInt(a));
    }
}

执行后报错:

Exception in thread "main" java.lang.NumberFormatException: For input string: "18233166440"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:583)
	at java.lang.Integer.parseInt(Integer.java:615)
	at com.daylywork.study.ZhuanHuan.main(ZhuanHuan.java:6)

想了想,就算我用错了字段,但是这手机号也应该可以转换成数字啊,之前其他人的代码也是用的Integer.parseInt,怎么我用就报错呢,在println处打了个断点,发现了其中的这么一个字段

int limit = -Integer.MAX_VALUE;

在这里插入图片描述

看到这里就明白了,我这个手机号已经突破了Int的最大值了,当然会报错,那如果我们非要用这个手机号怎么办呢,还是转化成Long类型吧。

下面的代码算是个简单的验证

package com.daylywork.study;

public class ZhuanHuan {
    public static void main(String[] args){
        String s="2147483647";
        System.out.println(Integer.parseInt(s));
        String sss="2147483648";
        System.out.println(Long.parseLong(sss));
        String ss="2147483648";
        System.out.println(Integer.parseInt(ss));
    }
}

结果:

2147483647
2147483648
Exception in thread "main" java.lang.NumberFormatException: For input string: "2147483648"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:587)
	at java.lang.Integer.parseInt(Integer.java:615)
	at com.daylywork.study.ZhuanHuan.main(ZhuanHuan.java:10)
代码分析package view; import model.Book; import model.BookDAO; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import static model.BookDAO.updateBook; public class BookView extends JFrame { private BookDAO bookDAO; private JTable bookTable; private DefaultTableModel tableModel; public BookView() { bookDAO = new BookDAO(); initializeUI(); } private void initializeUI() { setTitle("图书管理系统"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 创建按钮面板 JPanel buttonPanel = new JPanel(); JButton addButton = new JButton("添加书籍"); JButton viewButton = new JButton("查看所有书籍"); JButton updateButton = new JButton("更新书籍"); JButton deleteButton = new JButton("删除书籍"); addButton.setBackground(new Color(17, 248, 160)); viewButton.setBackground(new Color(17, 248, 160)); updateButton.setBackground(new Color(17, 248, 160)); deleteButton.setBackground(new Color(17, 248, 160)); buttonPanel.add(addButton); buttonPanel.add(viewButton); buttonPanel.add(updateButton); buttonPanel.add(deleteButton); buttonPanel.setLayout(new GridLayout(2, 2, 1, 10)); // 创建表格 bookTable = new JTable(); tableModel = new DefaultTableModel(new Object[]{"ID", "书名", "作者", "余量", "出版社"}, 0); bookTable.setModel(tableModel); bookTable.setRowHeight(40); bookTable.setBackground(Color.cyan); JScrollPane scrollPane = new JScrollPane(bookTable); // 添加组件到主面板 setLayout(new BorderLayout()); add(buttonPanel, BorderLayout.SOUTH); add(scrollPane, BorderLayout.CENTER); // 添加按钮事件监听器 addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addBook(); } }); viewButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { viewAllBook(); } }); updateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateBook(); } }); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { deleteBook(); } }); setVisible(true); } private void addBook() { JTextField idField = new JTextField(); JTextField nameField = new JTextField(); JTextField authorField = new JTextField(); JTextField numField = new JTextField(); JTextField pressField = new JTextField(); Object[] message = { "ID:", idField, "书名:", nameField, "作者:", authorField, "余量:", numField, "出版社:", pressField }; int option = JOptionPane.showConfirmDialog(this, message, "添加书籍", JOptionPane.OK_CANCEL_OPTION); if (option == JOptionPane.OK_OPTION) { int id = Integer.parseInt(idField.getText()); String name = nameField.getText(); String author = authorField.getText(); int num = Integer.parseInt(numField.getText()); String press = pressField.getText(); Book book = new Book(id, name, author, num, press); bookDAO.addBook(book); JOptionPane.showMessageDialog(this, "书籍已添加: " + book); viewAllBook(); // 更新表格数据 } } private void viewAllBook() { List<Book> books = bookDAO.getAllBook(); tableModel.setRowCount(0); // 清空表格 for (Book book : books) { tableModel.addRow(new Object[]{book.getBookId(), book.getBookName(), book.getBookAuthor(), book.getBookNum(), book.getBookPress()}); } } private void updateBook() { int selectedRow = bookTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, "请选择要更新的书籍。"); return; } int currentId = (int) tableModel.getValueAt(selectedRow, 0); JTextField idField = new JTextField(String.valueOf(currentId)); JTextField nameField = new JTextField((String) tableModel.getValueAt(selectedRow, 1)); JTextField authorField = new JTextField(String.valueOf(tableModel.getValueAt(selectedRow, 2))); JTextField numField = new JTextField(String.valueOf(tableModel.getValueAt(selectedRow, 3))); JTextField pressField = new JTextField(String.valueOf(tableModel.getValueAt(selectedRow, 4))); Object[] message = { "ID:", idField, "书名:", nameField, "作者:", authorField, "余量", numField, "出版社", pressField }; int option = JOptionPane.showConfirmDialog(this, message, "更新书籍", JOptionPane.OK_CANCEL_OPTION); if (option == JOptionPane.OK_OPTION) { int id = Integer.parseInt(idField.getText()); String name = nameField.getText(); String author = nameField.getText(); int num = Integer.parseInt(idField.getText()); String press = nameField.getText(); Book book = bookDAO.getBookById(currentId); if (book != null) { book.setBookId(id); book.setBookName(name); book.setBookAuthor(author); book.setBookNum(num); book.setBookPress(press); bookDAO.updateBook(book); JOptionPane.showMessageDialog(this, "书籍信息已更新: " + book); viewAllBook(); // 更新表格数据 } else { JOptionPane.showMessageDialog(this, "书籍ID不存在。"); } } } private void deleteBook() { int selectedRow = bookTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, "请选择要删除的书籍。"); return; } int id = (int) tableModel.getValueAt(selectedRow, 0); bookDAO.deleteBook(id); JOptionPane.showMessageDialog(this, "书籍已删除,ID: " + id); viewAllBook(); // 更新表格数据 } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new BookView(); } }); } }
最新发布
07-04
<think>我们分析给定的Java SwingGUI程序,这是一个图书管理系统的视图层代码。主要功能包括添加书籍、查看所有书籍、更新书籍和删除书籍。下面逐部分分析:1.**类定义与初始化**:-类名:`BookView`,继承自`JFrame`。-包含一个`BookDAO`对象(数据访问对象)用于操作数据。-包含一个`JTable`用于展示书籍列表,以及一个`DefaultTableModel`作为表格模型。 2. **构造函数**:-初始化`BookDAO`。-调用`initializeUI()`方法初始化用户界面。 3. **initializeUI()方法**:-设置窗口标题、大小、关闭操作和位置。-创建按钮面板(`buttonPanel`),包含四个按钮:添加、查看、更新、删除,并设置背景颜色。-创建表格和表格模型,设置表头(ID,书名,作者,余量,出版社)和表格背景色。-使用`BorderLayout`布局,按钮面板放在南边,表格放在中间。-为每个按钮添加事件监听器。4.**事件监听器**:- **添加书籍**:调用`addBook()`方法,弹出输入对话框,输入书籍信息,然后通过`bookDAO.addBook()`添加,并刷新表格。-**查看所有书籍**:调用`viewAllBook()`方法,从数据库获取所有书籍并显示在表格中。-**更新书籍**:调用`updateBook()`方法,先检查是否选中一行,然后弹出对话框(预填充当前选中行的信息),修改后更新数据库并刷新表格。- **删除书籍**:调用`deleteBook()`方法,删除选中的书籍并刷新表格。 5. **各功能方法**:- `addBook()`:使用多个文本字段收集信息,验证后添加书籍。-`viewAllBook()`:从数据库获取书籍列表,并更新表格模型。-`updateBook()`:获取选中行的当前ID,然后弹出对话框(预填充当前信息),注意这里更新时使用当前ID获取书籍对象,然后设置新值(注意:代码中更新时从输入字段获取数据有误,见问题)。-`deleteBook()`:删除选中行的书籍。6.**main方法**:在事件调度线程中创建`BookView`实例。 **代码中存在的问题**: 在`updateBook()`方法中,从输入字段获取数据时存在错误:```javaintid =Integer.parseInt(idField.getText()); Stringname =nameField.getText(); Stringauthor =nameField.getText();//这里应该是authorFieldint num= Integer.parseInt(idField.getText());//这里应该是numFieldStringpress =nameField.getText();//这里应该是pressField```错误地将作者、余量和出版社字段都设置成了`nameField`的内容,这会导致更新后的书籍信息错误。应修改为:```javaintid =Integer.parseInt(idField.getText()); Stringname =nameField.getText(); Stringauthor =authorField.getText(); intnum =Integer.parseInt(numField.getText()); Stringpress =pressField.getText(); ```另外,在更新书籍时,我们使用`currentId`从数据库获取书籍对象,然后更新该对象。注意,如果用户修改了ID,那么更新后的书籍ID会改变,但这里使用的是原来的ID(`currentId`)来获取书籍,所以修改ID是允许的,因为后续我们设置了新的ID。但是,如果新的ID已经存在,可能会导致问题(因为代码中没有检查新ID是否已存在)。不过,这取决于`updateBook`方法的实现(在`BookDAO`中),这里我们只关注视图层。**其他注意事项**:-在添加书籍时,ID是用户输入的整数,如果输入非整数会抛出异常,需要处理。 -删除书籍时,只根据ID删除,且ID是从表格当前选中行获取。**总结**:这个GUI程序实现了基本的增删改查功能,但在更新书籍的方法中存在字段赋值错误,需要修正。同时,应考虑添加异常处理,比如在输入非数字时提示用户。§§相关问题§§1.在`updateBook`方法中,如何修正从输入字段获取数据时的错误? 2.如果用户在添加书籍时输入的ID已经存在,程序会如何处理?需要如何改进? 3.在更新书籍信息时,如果用户修改了书籍ID,而新的ID已经存在于数据库中,可能会导致什么问题?如何避免?4.当前程序在添加或更新书籍时,如果用户输入非整数到ID或余量字段,会抛出异常。如何增强程序的健壮性来处理这种输入错误?5.在删除书籍时,是否应该在删除前增加一个确认对话框,以避免误操作?</think>### 代码分析 这段代码实现了一个基于Java Swing的图书管理系统GUI界面,主要功能包括: 1. **界面布局**: - 使用`BorderLayout`布局,表格居中显示,按钮面板在底部 - 表格包含5列:ID、书名、作者、余量、出版社 - 四个功能按钮(添加/查看/更新/删除)使用网格布局 2. **核心功能**: ```java // 添加书籍 private void addBook() { // 弹出输入对话框收集数据 // 调用bookDAO.addBook() } // 查看所有书籍 private void viewAllBook() { // 从DAO获取数据并刷新表格 } // 更新书籍(存在bug) private void updateBook() { // 获取选中行数据 // 弹出预填充对话框 // 调用bookDAO.updateBook() } // 删除书籍 private void deleteBook() { // 获取选中行ID // 调用bookDAO.deleteBook() } ``` 3. **存在问题**: - **更新功能bug**:在`updateBook()`方法中错误使用了字段赋值 ```java // 错误代码: String author = nameField.getText(); // 应该用authorField int num = Integer.parseInt(idField.getText()); // 应该用numField String press = nameField.getText(); // 应该用pressField ``` - **缺少输入验证**:未处理非数字输入(如ID/余量输入文本) - **UI细节**:删除操作前缺少确认对话框 - **数据刷新**:每次操作后都全量刷新表格,效率较低 4. **改进建议**: - 修复更新功能的字段赋值错误 - 添加输入验证(try-catch处理数字转换) - 实现局部数据刷新而非全表刷新 - 为删除操作添加确认对话框 - 使用卡片布局实现多视图切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值