【问题标题】:dictionary with different implementations; java.lang.ArrayStoreException具有不同实现的字典; java.lang.ArrayStoreException
【发布时间】:2016-04-09 11:59:40
【问题描述】:

所以我有一个关于字典的项目,它可以像普通字典一样显示列表。挑战在于,我们应该使用几个实现来显示单词,比如 treeDictionary、HashMap 等。

  1. 当我启动程序时,我必须选择我们想要使用什么样的实现,然后我选择 data.txt(在这个数据中,我们有第一个数组的德语单词和第一个数组的英语单词第二个)

  2. 在JTextArea上显示的文字之后,我希望有这个选项,用户不能关闭程序并重新启动它来选择另一个实现和数据等。

  3. 但是在我选择了第二个实现之后,eclipse 显示一个错误

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayStoreExceptionat java.lang.System.arraycopy(Native Method)

  1. 它侧重于我的 ensureCapasity 方法。

这是我的代码:

{
     Component myFrame = null;
     static double startTime = 0;
     int data[], summeEntry ;
     static int size;
     static String[] deutsch = new String[16000];
     static String[] englisch = new String[16000];

     private void ensureCapacity(String o[],int newCapacity){
    if(newCapacity < size) {
        return;
    }
    String [] a = o;
    data = new int[newCapacity];
    System.arraycopy(a, 0, data, 0, size);
     }   

    //open file
    public void read(File f) {
        LineNumberReader in = null;

        try {
            in = new LineNumberReader(new FileReader(f));
            String line;
            int i = 0;
            while ((line = in.readLine()) != null) {
                String[] sf = line.split(" ");
                if (sf.length == 2) {
                    if(size >= deutsch.length){
                        ensureCapacity(deutsch, size*2);
                        ensureCapacity(englisch, size*2);
                    }
                    //kamusGUI
                    kamusGUI.dt.insert(sf[0], sf[1]);
                    deutsch[i] = sf[0];
                    englisch[i] = sf[1];
                    size++;
                    i++;
                } else if (sf.length == 3) { //I just copy from the first if. Then it can calculate the actually number of words
                    if(size >= deutsch.length){
                        ensureCapacity(deutsch, size*2);
                        ensureCapacity(englisch, size*2);
                    }
                    kamusGUI.dt.insert(sf[0], sf[1] + sf[2]);
                    deutsch[i] = sf[0];
                    englisch[i] = sf[1] + sf[2];
                    size++;
                    i++;
                } else if(sf.length >= 3){
                    //wenn ein deutsches Wort mehr als 2 Bedeutungen hat
                    JOptionPane.showMessageDialog(myFrame, "Hallo, english more than 2 words");
                }
            }
            //to show your entries in output
            kamusSearchDelete.tOut.setText(kamusGUI.dt.toString());

            //to show how many entries you have from your dictionary
            kamusSearchDelete.stsEntry.setText("Total entr(y/ies): " + size + " words");
            in.close();
        } catch (IOException ex) {
            System.out.println("open canceled");
        }
    }

    public static void save(File f) {
        PrintWriter out = null;
        try {
            out = new PrintWriter(f);
            out.println(kamusGUI.dt.toString());
            out.close();
        } catch (IOException ex) {
            System.out.println("save canceled"); 

        }
    }

我已经构建了另一个 JButton 来调用 main 方法(可以说,我尝试通过这个按钮重置程序),我们可以选择另一个实现。但它不能正常工作。也许你们有任何想法,我应该用数组做什么?我非常感谢每一个建议或想法。

我添加了错误,也许你们想看看它

Exception in thread "AWT-EventQueue-0" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at aufgabe1.kamus.ensureCapacity(kamus.java:35)
at aufgabe1.kamus.read(kamus.java:50)
at aufgabe1.kamusMenu.actionPerformed(kamusMenu.java:156)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown    Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

  • 请将带有完整回溯的异常添加到问题本身中。

标签: java arrays dictionary implementation


【解决方案1】:

问题是您正在从一种类型的数组复制,该数组包含Stringint 值的引用。

String [] a = o;
data = new int[newCapacity];
System.arraycopy(a, 0, data, 0, size);

这永远行不通。

我应该如何处理数组?

您要么需要使数组具有相同的类型,要么必须将一种类型转换/解析为另一种类型。

我怀疑String o[] 没有使用,size 不是容量,而是使用的大小以及您真正希望它根据需要调整data 的大小。

private void ensureCapacity(int minCapacity){
    if(minCapacity <= data.length)
        return;

    int[] newData = new int[minCapacity];
    System.arraycopy(data, 0, newData , 0, size);
    data = newData;
 } 

【讨论】:

  • 你好@peter 现在我有另一个问题要显示单词的当前总条目。如果我选择另一种实现,总条目数总是会增加。它只需要显示当前的总数。不是旧实现+新实现的总数。你有什么想法吗?
【解决方案2】:

你打电话给System.arraycopy(a, 0, data, 0, size);

astring array,而 dataint array。我们不能将字符串数组复制到 int 数组,因此会出现异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多