【问题标题】:Why does this program get a ClassNotFound Exception? [closed]为什么这个程序会出现 ClassNotFound 异常? [关闭]
【发布时间】:2013-04-30 09:56:08
【问题描述】:

我需要这个简单的虚拟银行程序在每次启动时反序列化一个主账户。我已经这样做了,但是运行这个方法的 GUI 类继续给我一个java.lang.ClassNotFoundException。我不确定我的错误是什么或如何解决它,我该怎么办?我将在下面发布这两个类,因为我不确定在哪里可以找到错误。

BankGUI 类:

package GUIs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;

import virtualBank3.BankAccount;

@SuppressWarnings("serial")
public class BankGUI implements Serializable {

    BankAccount account;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        BankGUI gui = new BankGUI();
        gui.deserializeAccount();
        gui.displayGUI();
    }

    // all global components for JFrame
    JTextArea statusArea;
    JCheckBox isLockedCheckBox;
    JList depositAmount;
    JList withdrawAmount;
    JButton depositButton;
    JButton withdrawButton;
    JButton saveAccountButton;

    private void displayGUI() {
        JFrame frame = new JFrame("Virtual Bank v3.3");

        Integer[] intList = { 1, 2, 5, 10, 20, 50, 100, 150, 250, 500 };

        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
        rightPanel.setBackground(Color.GREEN);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.GREEN);
        centerPanel.setLayout(new GridBagLayout());

        frame.add(BorderLayout.CENTER, centerPanel);
        frame.add(BorderLayout.EAST, rightPanel);

        // add some JLabel's
        JLabel depositAmountLabel = new JLabel("Deposit Amount:");
        JLabel withdrawAmountLabel = new JLabel("Withdraw Amount:");
        JLabel isLockedLabel = new JLabel("Lock account(True/False)");

        // finish components(center panel)
        statusArea = new JTextArea(15, 22);
        statusArea.setEditable(false);
        // add this to panel
        isLockedCheckBox = new JCheckBox();
        // add this to panel


        // scrollers and Jlists
        //***********************************************************************
        depositAmount = new JList(intList);
        JScrollPane scroller1 = new JScrollPane(depositAmount);
        scroller1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        depositAmount.setVisibleRowCount(1);
        depositAmount.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


        withdrawAmount = new JList(intList);
        JScrollPane scroller2 = new JScrollPane(depositAmount);
        scroller2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        depositAmount.setVisibleRowCount(1);
        depositAmount.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //***********************************************************************

        depositButton = new JButton("Deposit Amount.");
        withdrawButton = new JButton("Withdraw Amount");
        saveAccountButton = new JButton("Save your Account");

        frame.setSize(425, 650);
        frame.setVisible(true);
    }

    private void serializeAccount() {
        try {
            ObjectOutputStream objectStream1 = new ObjectOutputStream(
                    new FileOutputStream("bankAccounts.txt"));
            objectStream1.writeObject(account);
            objectStream1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void deserializeAccount() {
        try {
            ObjectInputStream objectStream2 = new ObjectInputStream(
                    new FileInputStream("bankAccounts.txt"));
            account = (BankAccount) objectStream2.readObject();
            objectStream2.close();
            //test it
            System.out.println("It worked.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

BankAccount 类:

package virtualBank3;

import java.io.Serializable;

public class BankAccount implements Serializable {

    private static final long serialVersionUID = -5341449653011848470L;

    int balance = 0;
    int userWallet = 0;
    String owner = "Hello, world";
    String accountStat = "Account Owner: " + owner + "\nAccount balance: $"
            + balance + "\nOwner Wallet Balance: $" + userWallet;
    Boolean isLocked = false;

    public int withdraw(int amount) {
        balance -= amount;
        userWallet += amount;
        return userWallet;
    }

    public int deposit(int amount) {
        balance += amount;
        userWallet -= amount;
        return balance;
    }

    public int depositCashIntoWallet(int amount) {
        userWallet += amount;
        return userWallet;
    }


}

这是错误:

java.lang.ClassNotFoundException: virtualBank3.Account
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at GUIs.BankGUI.deserializeAccount(BankGUI.java:123)
    at GUIs.BankGUI.main(BankGUI.java:40)

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 将异常堆栈跟踪复制/粘贴为edit to the question。提供它们是有充分理由的!
  • virtualBank3 包下是否存在类 Account?
  • @HashSlingingHacker 您是否已将类名从 Account 更改为 BankAccount 并序列化数据?然后,当尝试重新读取序列化数据时,它正在寻找一个 Account 类(不再存在)。这可能吗?你在哪里有一个 virtualBank3.Account 类?
  • @HashSlingingHacker,正如 KPZ 所说,它在您的堆栈跟踪中。它正在反序列化您的数据,但会找到一个“Account.class”序列化对象。您已经更改了代码以使用 BankAccount,因此该类不再存在。我会删除所有序列化文件,以确保使用您的 BankAccount 类对其进行序列化。

标签: java swing serialization classnotfoundexception


【解决方案1】:

这是一个命名问题 - 您有一个 public class virtualBank3.BankAccount,但序列化文件引用了 virtualBank3.Account。序列化文件是你写的,还是给你的?如果是前者,您重命名了一个类,但没有重新创建序列化文件。

【讨论】:

  • 我写了这个,我真的很困惑。我很久以前就更改了名称,以避免与以前的课程混淆。我不确定你们为什么认为Account 是个问题。它不存在。
  • 问题是Account不存在,但是序列化文件中还是引用了它;反序列化代码查看文件以确定要加载的类名,但没有找到所需的类,因此出现 ClassNotFound 错误。
  • 重新创建您的 bankAccounts.txt 文件。
【解决方案2】:

根据我上面的 cmets 现在迷路了:

@HashSlingingHacker 您是否将类名从 Account 更改为 BankAccount 并序列化数据?然后,当尝试重新读取序列化数据时,它正在寻找一个 Account 类(不再存在)。这可能吗?你在哪里有 virtualBank3.Account 类?

正如 KPZ 所说,Account.class 在您的堆栈跟踪中被引用:

java.lang.ClassNotFoundException: virtualBank3.Account

它正在反序列化您的数据,但会找到一个“Account.class”序列化对象。您已将代码更改为使用 BankAccount,因此该类不再存在。我会删除所有序列化文件以确保使用您的 BankAccount 类对其进行序列化。

【讨论】:

  • 我删除了我的 bankAccounts.txt,然后使用我的 serializeAccount 方法“跳转”了我的项目。感谢您的帮助。
【解决方案3】:

我假设您正在研究 Eclipse。我猜你已经将你的 class Account 重命名为 BankAccount

试试:

  • 删除bankAccounts.txt
  • 清理项目(项目 -> 清理... -> 清理所有项目)
  • 再次运行您的项目

【讨论】:

    【解决方案4】:

    就这样做

    项目--->清理--->清理所有项目

    因为您将班级 Account 重命名为 BankAccount

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多