我的代码中出现NumberFormatException错误我确保每个文件都不为空

问题描述

我正在创建每日保存日志。在创建时,我收到此 NumberFormatException 。我需要一些帮助来完成该项目。

这是我正在处理的代码

package app;

import java.awt.EventQueue;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import javax.swing.JSeparator;
import javax.swing.border.MatteBorder;

public class Application {
    
     BufferedWriter log = null;
     BufferedWriter bal = null;

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {
            public void run() {
                try {
                    Appilcation window = new Appilcation();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Appilcation() {
        try {
            initialize();
        } catch (IOException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
    }

    /**
     * Initialize the contents of the frame.
     * @throws IOException 
     */
    @SuppressWarnings("resource")
    private void initialize() throws IOException,NumberFormatException{
        frame = new JFrame();
        frame.setUndecorated(true);
        frame.setBounds(100,100,450,420);
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

         
            log= new BufferedWriter(new FileWriter(new File("Log.txt")));//writer for log
            bal= new BufferedWriter(new FileWriter(new File("bal.txt")));// "      "  bal
            Scanner File = new Scanner(new File("bal.txt"));
           //SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");  
          // Date date = new Date(); 
           
           
        
        JPanel panel = new JPanel();
        panel.setBackground(new Color(255,102));
        panel.setBounds(0,420);
        frame.getContentPane().add(panel);
        panel.setLayout(null);
        
        JLabel lblDdmmyyyy = new JLabel("dd/mm/yyyy");
        lblDdmmyyyy.setFont(new Font("ARCADE",Font.PLAIN,16));
        lblDdmmyyyy.setHorizontalAlignment(SwingConstants.CENTER);
        lblDdmmyyyy.setHorizontalTextPosition(SwingConstants.CENTER);
        lblDdmmyyyy.setBounds(10,11,29);
        panel.add(lblDdmmyyyy);
        
        JLabel lblHh = new JLabel("hh:mm:ss");
        lblHh.setFont(new Font("ARCADE",16));
        lblHh.setHorizontalAlignment(SwingConstants.CENTER);
        lblHh.setBounds(324,29);
        panel.add(lblHh);
        
        JButton btnAddSavings = new JButton("Add");
        btnAddSavings.setBackground(new Color(255,255,0));
        btnAddSavings.setFont(new Font("ARCADE",16));
        btnAddSavings.addActionListener(new ActionListener() {
            //something is not ryt here
            public void actionPerformed(ActionEvent arg0) {
                String Add=JOptionPane.showInputDialog(panel,"Enter Amount to be added");
                String s=/*sdf.format(date)+**/"   "+Add+"(Added)";
                String Bal="";
                while(File.hasNextLine())
                     Bal=File.nextLine(); 
                int aa=Integer.parseInt(Bal);
                int bb =Integer.parseInt(Add);
                int sum=aa+bb;
                
                    try {
                        bal.write(sum+"\n");
                        log.write(s+"\n");
                        
                    } catch (IOException e) {
                        // Todo Auto-generated catch block
                        e.printstacktrace();
                    }
              
               
               
               
            }
        });
        btnAddSavings.setBounds(138,150,173,64);
        panel.add(btnAddSavings);
        
        JButton btnRemove = new JButton("Remove");
        btnRemove.setBackground(new Color(255,127,80));
        btnRemove.setFont(new Font("ARCADE",16));
        btnRemove.setBounds(138,225,64);
        panel.add(btnRemove);
        
        JButton btnIdeas = new JButton("ideas");
        btnIdeas.setBackground(new Color(153,204,255));
        btnIdeas.setFont(new Font("ARCADE",16));
        btnIdeas.setBounds(138,300,34);
        panel.add(btnIdeas);
        
        JButton btnExit = new JButton("Log");
        btnExit.setBackground(new Color(204,255));
        btnExit.setBounds(138,345,71,23);
        panel.add(btnExit);
        
        JButton btnExit_1 = new JButton("Exit");
        btnExit_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });
        btnExit_1.setBackground(new Color(204,255));
        btnExit_1.setBounds(240,23);
        panel.add(btnExit_1);
        
        JLabel lblrs = new JLabel("0   Rs.");
        lblrs.setBackground(new Color(0,0));
        lblrs.setFont(new Font("Bebas",23));
        lblrs.setHorizontalAlignment(SwingConstants.CENTER);
        lblrs.setBounds(105,81,239,58);
        panel.add(lblrs);
        
        JPanel panel_1 = new JPanel();
        panel_1.setBorder(new MatteBorder(2,2,(Color) new Color(0,0)));
        panel_1.setBackground(new Color(0,0));
        panel_1.setBounds(105,58);
        panel.add(panel_1);
        bal.close();
        log.close();
        
    }
    }

错误消息:

线程“ AWT-EventQueue-0”中的异常 java.lang.NumberFormatException:对于输入字符串:“”位于 java.base / java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) 在java.base / java.lang.Integer.parseInt(Integer.java:668)在 java.base / java.lang.Integer.parseInt(Integer.java:776)在 app.Appilcation $ 2.actionPerformed(Appilcation.java:113)在 java.desktop / javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) 在 java.desktop / javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2308) 在 java.desktop / javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) 在 java.desktop / javax.swing.DefaultButtonModel.setpressed(DefaultButtonModel.java:262) 在 java.desktop / javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279) 在 java.desktop / java.awt.Component.processMouseEvent(Component.java:6632) 在 java.desktop / javax.swing.JComponent.processMouseEvent(JComponent.java:3342) 在java.desktop / java.awt.Component.processEvent(Component.java:6397) 在java.desktop / java.awt.Container.processEvent(Container.java:2263) 在 java.desktop / java.awt.Component.dispatchEventImpl(Component.java:5008) 在 java.desktop / java.awt.Container.dispatchEventImpl(Container.java:2321) 在java.desktop / java.awt.Component.dispatchEvent(Component.java:4840) 在 java.desktop / java.awt.Lightweightdispatcher.retargetMouseEvent(Container.java:4918) 在 java.desktop / java.awt.Lightweightdispatcher.processMouseEvent(Container.java:4547) 在 java.desktop / java.awt.Lightweightdispatcher.dispatchEvent(Container.java:4488) 在 java.desktop / java.awt.Container.dispatchEventImpl(Container.java:2307) 在java.desktop / java.awt.Window.dispatchEventImpl(Window.java:2762) 在java.desktop / java.awt.Component.dispatchEvent(Component.java:4840) 在 java.desktop / java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) 在java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:721)在 java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:715)在 java.base / java.security.AccessController.doPrivileged(AccessController.java:389) 在 java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) 在 java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95) 在java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:745)在 java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:743)在 java.base / java.security.AccessController.doPrivileged(AccessController.java:389) 在 java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) 在 java.desktop / java.awt.EventQueue.dispatchEvent(EventQueue.java:742) 在 java.desktop / java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:203) 在 java.desktop / java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:124) 在 java.desktop / java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:113) 在 java.desktop / java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:109) 在 java.desktop / java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:101) 在 java.desktop / java.awt.EventdispatchThread.run(EventdispatchThread.java:90)

我尝试过的事情:

->确保所有文件都不为空。

这里没有什么帮助。

解决方法

问题似乎是一个文件中有一个空行。在解析Bal之前,请检查它是否为空。

,

以下代码段中与未验证的输入有关的几个问题

    Add返回的
  1. JOptionPane可以为空或不是数字
  2. Bal可能为空:实际上Bal被分配了文件中的最后一行。因此,文件可能是非空的,但可能包含结尾的空行,因此Bal"";
    String Add=JOptionPane.showInputDialog(panel,"Enter Amount to be added");
    String s=/*sdf.format(date)+**/"   "+Add+"(Added)";
    String Bal="";
    while(File.hasNextLine())
        Bal=File.nextLine(); 
    int aa=Integer.parseInt(Bal);
    int bb =Integer.parseInt(Add);
    int sum=aa+bb;

因此,您可能想实现一个单独的方法来解析数字,而不会失败:

    private static int getNumber(String s) {
        int res = 0;
        try {
            res = Integer.parseInt(s);
        } catch (Exception ex) {
            System.err.println("Failed to parse number from '" + s + "'," + ex.getMessage());
            res = 0;
        }
        return res;
    }
// ...
    int aa = getNumber(Bal);
    System.out.printf("DEBUG: Bal='%s' -> aa=%d%n",Bal,aa);
    int bb = getNumber(Add);
    System.out.printf("DEBUG: Add='%s' -> bb=%d%n",Add,bb);