java - 找不到错误 (StackOverflowError)

标签 java windows swing sudoku stack-overflow

我正在编写一个数独解决程序,但我遇到了以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.util.HashMap.hash(Unknown Source)
at java.util.HashMap.getEntry(Unknown Source)
at java.util.HashMap.get(Unknown Source)
at sun.awt.AppContext.get(Unknown Source)
at sun.awt.SunToolkit.flushPendingEvents(Unknown Source)
at java.awt.EventQueue.postEvent(Unknown Source)
at java.awt.EventQueue.invokeLater(Unknown Source)
at javax.swing.SwingUtilities.invokeLater(Unknown Source)
at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
at javax.swing.text.DefaultCaret.setDot(Unknown Source)
at javax.swing.text.DefaultCaret$Handler.insertUpdate(Unknown Source)
at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
at javax.swing.text.AbstractDocument.insertString(Unknown Source)
at javax.swing.text.PlainDocument.insertString(Unknown Source)
at javax.swing.text.AbstractDocument.replace(Unknown Source)
at javax.swing.text.JTextComponent.setText(Unknown Source)

我找不到这个错误的原因。我的程序代码如下:

package code;

import java.awt.Color;                                         //Import nötiger Klassen
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 




public class SOLVE implements ActionListener{

private int[][] matrix;                         //Eingelesenes Sudokufeld
private boolean[][]input;                       //Überfrüfungsfeld zur bestimmung von eingegebenen Zahlen

private JFrame fenster;                         //GUI Fenster
private JTextArea field[][];                    //GUI Text Sudoku Feld
private JButton start;                          //Start Button
private JButton reset;


public void gui(){                                            //Erstellt die Grafische Oberfläche
    Border b1 = BorderFactory.createLineBorder( Color.black );

    //Erstellt Fenster
    fenster = new JFrame();
    fenster.setLocation(100, 100);
    fenster.setSize(500, 320);
    fenster.getContentPane().setLayout(null);
    fenster.setTitle("Sudoku Solver");

    //Erstellt Sudoku TextFelder
    field = new JTextArea[9][9];
    int x = 0;      //x-Koordinate
    for(int i=0;i<9;i++){
        int y = 0;     //y-Koordinate
        for(int j=0;j<9;j++){
            field[i][j] = new JTextArea();
            field[i][j].setLocation((200+x),(30+y));
            field[i][j].setSize(20, 20);
            field[i][j].setText("0");
            field[i][j].setBorder(b1);
            field[i][j].setVisible(true);
            fenster.add(field[i][j]);
            if(j==2||j==5){
                y=y+32;
            }
            else{
                y=y+25;
            }
        }
        if(i==2||i==5){
            x=x+32;
        }
        else{
            x=x+25;
        }
    }

    //Erstellt Start Button
    start = new JButton();
    start.setText("Solve");
    start.setSize(150,50);
    start.setLocation(30,30);
    start.addActionListener(this);

    //Erstellt Reset Button
    reset = new JButton();
    reset.setText("Reset");
    reset.setSize(150,50);
    reset.setLocation(30,100);
    reset.addActionListener(this);


    //Fügt Komponenten zum Fenster hinzu
    fenster.add(reset);
    fenster.add(start);
    fenster.setVisible(true);
}

public SOLVE(){                                               //Startet Klasse
    gui();
    matrix = new int[9][9];
    input = new boolean[9][9];
}

public void copy(){                                           //Einlesen der TextFelder in die Matrix une Überprüfungs Matrix
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            matrix[i][j]=Integer.parseInt(field[i][j].getText());
            if(matrix[i][j]!=0){
                input[i][j]=false;
            }
            else{
                input[i][j] = true;
            }
        }
    }   
}

public boolean check(int x,int y, int solution){              //Überprüfung ob Lösung möglich ist für eine bestimmte Zahl bei einem bestimmten Feld
    boolean moeglich = false; //Insgesammt möglich
    boolean wmoeglich = true; //Waagrecht möglich
    boolean smoeglich = true; //Senkrecht möglich
    boolean fmoeglich = true; //Feld möglich

    //Überprüft waagrecht und senkrecht ob möglich
    for(int i=0;i<9;i++){
        if(matrix[x][i]==solution){
            wmoeglich = false;
        }
        if(matrix[i][y]==solution){
            smoeglich = false;
        }
    }
    //Sucht nötiges Feld und überprüft dieses

    //Oberste Reihe
    if(x<3){
        //linkes Feld
        if(y<3){
            for(int i=0;i<3;i++){
                for(int j=0;j<3;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //mittleres Feld
        else if(y<6&& y>2){
            for(int i=0;i<3;i++){
                for(int j=3;j<6;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //rechtes Feld
        else if(y<9 && y>5){
            for(int i=0;i<3;i++){
                for(int j=6;j<9;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
    }
    //mittlere Reihe
    else if(x<6 && x>2){
        //linkes Feld
        if(y<3){
            for(int i=3;i<6;i++){
                for(int j=0;j<3;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //mittleres Feld
        else if(y<6 && y>2){
            for(int i=3;i<6;i++){
                for(int j=3;j<6;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //rechtes Feld
        else if(y<9 && y>5){
            for(int i=3;i<6;i++){
                for(int j=6;j<9;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
    }
    //unterste Reihe
    else if(x<9 && x>5){
        //linkes Feld
        if(y<3){
            for(int i=6;i<9;i++){
                for(int j=0;j<3;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //mittleres Feld
        else if(y<6 && y>2){
            for(int i=6;i<9;i++){
                for(int j=3;j<6;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
        //rechtes Feld
        else if(y<9 && y>5){
            for(int i=6;i<9;i++){
                for(int j=6;j<9;j++){
                    if(matrix[i][j]==solution){
                        fmoeglich = false;
                    }
                }
            }
        }
    }

    //wenn eine Überprüfung fehlgeschlagen Lösung nicht möglich
    if(smoeglich == true && wmoeglich == true && fmoeglich == true){
        moeglich = true;
    }
    return moeglich;
}

public void search(int i, int j){                             //Lösen des Sudokus (Eigentlich Rekursiv)
    if(input[i][j]==true){  //Wenn keine menschliche eingabe
        int l = 1;
        for(l=1;l<10;l++){
            if(check(i,j,l)==true){  //Wenn Überprüfung erfolgreich war
                  matrix[i][j]=l;    //Schreibt Lösung in Matrix
                  field[i][j].setText(""+l); //Und Schreibt Lösung in TextFeld

                  //Nachfolger suchen
                    if(i<=7){
                       search(i+1,j);   
                    }
                    else if(i==8 && j<=7){
                        search(i-8,j+1);
                    }
                    else{
                        break;
                    }
            }
            //Da Rekursion nicht funktionierte hier den Schritt zurück 
            else if(check(i,j,l)==false && l==9){
                matrix[i][j]=0;
                if(i>0){
                    search(i-1,j);
                }
                else if(i==0 && j>0){
                    search(i+8,j-1);
                }
                else{
                    break;
                }
            }
        }
    }
    else{
        //Nachfolger suchen
        if(i<=7){
             search(i+1,j);      
        }
        else if(i==8 && j<=7){
            search(i-8,j+1);
        }
        else{}
    }
}

public void reset(){                                          //Resettet Fenster und Matrix
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            field[i][j].setText("0");
            matrix[i][j]=0;
            input[i][j]=true;
        }
    }
}

public void master(){                                         //Master Methode (Führt die nötigen Methoden nacheinander aus)
    System.gc();
    copy();
    search(0,0);    
}

public static void main(String[] args) {                      //Main Methode (Start Methode)
    new SOLVE();
}

public void actionPerformed(ActionEvent evt){                 //Button Abfrage
    Object source = evt.getSource();

    if(source==start){  //Wenn Button 'start' keklckt wird Methode main ausführen
        master();
    }
    else if(source == reset){
        reset();
    }
}
}

这个错误的原因可能是什么?很抱歉代码中的注释是德语,但如果您需要,我可以将它们翻译成英语。

最佳答案

据我所知,“AWT-EventQueue-0”异常是在您使用 HashMap 执行异步操作时产生的。我强烈建议您将 View 与模型分开!如果有必要,还要分离 Controller :

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

您是否从执行停止的那一行得到了一个数字?因为这确实有助于确定问题的根源。您也可以对代码进行调试。我推荐 Eclipse (Indigo),因为它有一个很好的内置调试器和许多其他巧妙的东西。它在你身上成长!


小贴士

尝试按照问题形式:

https://stackoverflow.com/questions/how-to-ask

因为当您留下 3 页完全不相关的代码时,这真的很难! (关于语言;我认为德语中的注释和变量名称并不难理解。我的意思是,我知道您正在实例化什么,因此名称可以是“asdf”或“foob​​ar”,我只关心。)

此外,请务必将类的构造函数放在类变量减速后的第一个方法中;因为这使得快速识别它变得容易得多。

关于java - 找不到错误 (StackOverflowError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996820/

相关文章:

java - 为什么 Java 8 类型推断在重载选择中不考虑 Lambda 抛出的异常?

windows - Win 2008 R2 64bit VFP 计划任务问题

java - Jpanel 中的动画组件

java - 按钮/JPanel 网格显示不正确

java - 从另一个类向 JButton 添加 ActionListener 会引发 NullPointerException?

java - Spring WS 客户端 - 如何在不使用 Axis 的情况下为 WSDL 创建映射 POJO

java - 为什么 PDFBox 返回大小为 0 x 0 的图像尺寸

java - 抽屉导航中的返回语句是什么意思?

c# - 如何在不考虑缓存域凭据的情况下验证域凭据

windows - .pdata 部分中包含的结构