-2

私はJavaにかなり慣れていないので、迷路に変えたい次のテキストファイルがあります。

*************************************************
*************************************************
*************************************************
************************S************************
*******************      *F    ******************
****************   * * *******    ***************
**************    *         * ***   *************
*************  *                 **   ***********
************  *    **    *         **  **********
**********   *      *   ***      **     *********
**********          **         **     *   *******
***************       **     **     *****  ******
*****************       ** **      ******* ******
******************        *  *   *********  *****
******* ************         * ************ *****
******      ********** *    * **********     ****
******  **    ********  *  * ********        ****
*****  ***      *******  *   ******    * ***  ***
*****  ** *       ****** *  ******     * ***  ***
****   ** *     ******** *  ********   *  **  ***
****   ** *    ** *******  ******* ** * * **   **
****  ** * *** **  ******  ******  **  *   *   **
****  **  * *  **********  ********** *** ***  **
****  *** **** ********* *  ********* **  ***  **
**** ****  ***  *******      *******  ** ****  **
**** ***** ***   ******       *****  *   ***** **
****  ****  * *    **               *** *****  **
****  ** **   ** *     *     *     * * ***** * **
****  *******     * * ********* * *   ** ****  **
**** ***** *****   * * * *** ***  ****** ***   **
****  ** **   *******   *** *  ******* **** * ***
*****  ***** * * ********* ***** **  * ****** ***
*****  **  *** *  *  **********   *  * * **   ***
****** ** * ** *  *  *   **   *   *  *** **  ****
******  ***  ***  *  *        ** ** *** ***  ****
******   ** *  ***** *    *    * ****   **  *****
*******   *** * ** ****   *   **** ** ***  ******
********   **** *  * **********   * ***   *******
*********   ****  *     *       * * *** *********
**********    *****  *        * ******  *********
*********** *    ***** ** ** ********** *********
************  **   **************  ** ***********
**************** *               **  ************
**************** *******      **** **************
******************  ****** ****  ****************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************

問題は、ファイルをアップロードしようとするたびに(202行目から)「ファイルエラー」メッセージが表示され続けることです。これが私のメインプログラムです:

/*
 * MazeRunner.java
 *
 */
package mazerunner;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import javax.swing.Timer;
import javax.swing.JFileChooser;
import javax.swing.JPanel;

public class MazeRunner extends javax.swing.JFrame {

    public static final int wall = 0;
    public static final int open = 1;
    public static final int visited = 2;
    public static final int onpath = 3;
    public static final int start = 4;
    public static final int end = 5;
    public static final int pending = 6;
    public static final int mazeSize = 50;
    public static Color[] colors = {Color.BLACK, Color.WHITE, Color.MAGENTA, Color.ORANGE,
        Color.CYAN, Color.RED, Color.LIGHT_GRAY};
    JFileChooser fileChooser = new JFileChooser();
    public int maze[][] = new int[mazeSize][mazeSize];
    public Timer clock = new Timer(100, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            tick();
            mazePanel.repaint();
        }
    });

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MazeRunner().setVisible(true);
            }
        });
    }

    public class MyPanel extends JPanel {

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            for (int i = 0; i < mazeSize; i++) {
                for (int j = 0; j < mazeSize; j++) {
                    g.setColor(colors[maze[i][j]]);
                    g.fillRect(i, j, 12, 12);
                }
            }
        }
    }

    public MazeRunner() {
        initComponents();
        clock.start();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        mazePanel = new MyPanel();
        loadMaze = new javax.swing.JButton();
        collectionSelection = new javax.swing.JComboBox();
        title = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        mazePanel.setBackground(new java.awt.Color(204, 255, 204));
        mazePanel.setPreferredSize(new java.awt.Dimension(600, 600));

        org.jdesktop.layout.GroupLayout mazePanelLayout = new org.jdesktop.layout.GroupLayout(mazePanel);
        mazePanel.setLayout(mazePanelLayout);
        mazePanelLayout.setHorizontalGroup(
            mazePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 600, Short.MAX_VALUE)
        );
        mazePanelLayout.setVerticalGroup(
            mazePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 600, Short.MAX_VALUE)
        );

        loadMaze.setText("Load File");
        loadMaze.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                loadMazeActionPerformed(evt);
            }
        });

        collectionSelection.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Stack", "Queue" }));

        title.setText("No File Loaded");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .addContainerGap()
                        .add(mazePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(layout.createSequentialGroup()
                        .add(54, 54, 54)
                        .add(title, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 351, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .add(28, 28, 28)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(loadMaze, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(46, 46, 46))
                    .add(layout.createSequentialGroup()
                        .add(collectionSelection, 0, 111, Short.MAX_VALUE)
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(loadMaze)
                        .add(81, 81, 81)
                        .add(collectionSelection, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(layout.createSequentialGroup()
                        .add(title, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                        .add(mazePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void loadMazeActionPerformed(java.awt.event.ActionEvent evt) {                                         

        int retval = fileChooser.showOpenDialog(this);
        if (retval == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            try {
                BufferedReader reader = new BufferedReader(new FileReader(file));
                String s;
                while ((s = reader.readLine()) != null) {
                    for (int i = 0; i < mazeSize; i++) {
                        for (int j = 0; j < mazeSize; j++) {


                            if (s.charAt(j) == '*') {
                                maze[i][j] = wall;
                            }
                            if (s.charAt(j) == ' ') {
                                maze[i][j] = open;
                            }
                            if (s.charAt(j) == 'F') {
                                maze[i][j] = end;
                            }
                            if (s.charAt(j) == 'S') {
                                maze[i][j] = start;
                            } else {
                                maze[i][j] = wall;
                            }
                        }
                    }
                }
            } catch (Exception e) {
                title.setText("File Error");
            }
        }

    }                                        
    // Variables declaration - do not modify                     
    private javax.swing.JComboBox collectionSelection;
    private javax.swing.JButton loadMaze;
    private javax.swing.JPanel mazePanel;
    private javax.swing.JLabel title;
    // End of variables declaration                   
}

問題はこのコードセグメントにあると思いますが、どのようにそれをだましても、それを機能させることはできません。

private void loadMazeActionPerformed(java.awt.event.ActionEvent evt) {                                         

            int retval = fileChooser.showOpenDialog(this);
            if (retval == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                try {
                    BufferedReader reader = new BufferedReader(new FileReader(file));
                    String s;
                    while ((s = reader.readLine()) != null) {
                        for (int i = 0; i < mazeSize; i++) {
                            for (int j = 0; j < mazeSize; j++) {


                                if (s.charAt(j) == '*') {
                                    maze[i][j] = wall;
                                }
                                if (s.charAt(j) == ' ') {
                                    maze[i][j] = open;
                                }
                                if (s.charAt(j) == 'F') {
                                    maze[i][j] = end;
                                }
                                if (s.charAt(j) == 'S') {
                                    maze[i][j] = start;
                                } else {
                                    maze[i][j] = wall;
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    title.setText("File Error");
                }
            }

        }

生成されたスタックトレースは次のとおりです。

java.lang.StringIndexOutOfBoundsException: String index out of range: 49
    at java.lang.String.charAt(String.java:686)
    at mazerunner.MazeRunner.loadMazeActionPerformed(MazeRunner.java:172)
    at mazerunner.MazeRunner.access$100(MazeRunner.java:19)
    at mazerunner.MazeRunner$3.actionPerformed(MazeRunner.java:111)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6382)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
    at java.awt.Component.processEvent(Component.java:6147)
    at java.awt.Container.processEvent(Container.java:2083)
    at java.awt.Component.dispatchEventImpl(Component.java:4744)
    at java.awt.Container.dispatchEventImpl(Container.java:2141)
    at java.awt.Component.dispatchEvent(Component.java:4572)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
    at java.awt.Container.dispatchEventImpl(Container.java:2127)
    at java.awt.Window.dispatchEventImpl(Window.java:2489)
    at java.awt.Component.dispatchEvent(Component.java:4572)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704)
    at java.awt.EventQueue.access$400(EventQueue.java:82)
    at java.awt.EventQueue$2.run(EventQueue.java:663)
    at java.awt.EventQueue$2.run(EventQueue.java:661)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$3.run(EventQueue.java:677)
    at java.awt.EventQueue$3.run(EventQueue.java:675)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:674)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)  

誰かが私を正しい方向に向けることができれば、それは大いにありがたいです!

4

3 に答える 3

2

問題は、迷路のサイズが実際には 50 ではないことです。まず、0 からカウントを開始しているため、実際よりも 1 少なくする必要があります。次に、提供したファイルの各行には 49 文字しかありません。mazesize を 48 に変更するだけで動作するはずです。ただし、コードを少し読みやすくすることに取り組みたいと思うかもしれません。

于 2013-03-09T23:07:39.230 に答える
2

問題は次の行で発生します。

if (s.charAt(j) == '*')

このエラーは、インデックス ( ) が( j) 内の文字数よりも大きいことを示しています。の値を設定する方法を見てください。Stringsj

for (int j = 0; j < mazeSize; j++)

mazeSizeの長さよりも大きいと推測できsます。ループの別の終了条件を見つけ出す必要があります。

psこれらの問題を自分で見つけることができるように、独自のコードをデバッグする方法を学ぶことをお勧めします。ここでは説明しませんが、コードには他にも問題があります。コード全体にステートメントを追加するかSystem.out.println()、IDE からデバッガーを使用することで、問題を解決することができます。

于 2013-03-09T23:08:32.440 に答える
0

前に述べたように、問題はファイルのすべての行に50が49(または48)文字が含まれていないという事実に起因します。for-statementIMOは、このコード行で迷路を表すファイルのすべての行の文字列をすでに読み取っているので、これを2倍にする必要はありません。

String s;
while ((s = reader.readLine()) != null) {

したがって、しばらくの間、ここで1つのステートメントを実行する必要があり、文字列のサイズを任意に選択する必要はありませんが、代わりに:

for(int i = 0 ; i < s.length() ; i++) {
    if(s.charAt(i) == '*') {
        // etc...

したがって、最終的にあなたのステートメントは次のようになります:

String s;

while ((s = reader.readLine()) != null) 
{
    for(int i = 0 ; i < s.length() ; i++) 
    {
        if(s.charAt(i) == '*') { maze[i][j] = wall; }
        if(s.charAt(j) == ' ') { maze[i][j] = open; }
        if(s.charAt(j) == 'F') { maze[i][j] = end; }
        if(s.charAt(j) == 'S') { maze[i][j] = start; } 
        else { maze[i][j] = wall; }
    }
}
于 2013-03-09T23:14:33.037 に答える