Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从差异类调用方法时出现NullPointer异常_Java_Nullpointerexception_Method Call - Fatal编程技术网

Java 从差异类调用方法时出现NullPointer异常

Java 从差异类调用方法时出现NullPointer异常,java,nullpointerexception,method-call,Java,Nullpointerexception,Method Call,爪哇- 你好 我正在写一个扫雷舰程序(第一个大人物),我真的被卡住了。根据我要遵循的规范,程序本身由2个类组成(一个用于逻辑,一个用于GUI)。这两门课我都做了不少,但我也没有完成。然而,我试图测试从一个类到另一个类的调用方法的实现,这就是我遇到的问题。在GUI类中,我试图在用户每次单击一个框时调用Logic类中的方法openCell(intx,inty)。该逻辑类方法将依次检查方块上是否有地雷、0或数字,并从GUI类调用相应的方法。误差中涉及的两种方法如下: GUI CLASS public

爪哇- 你好 我正在写一个扫雷舰程序(第一个大人物),我真的被卡住了。根据我要遵循的规范,程序本身由2个类组成(一个用于逻辑,一个用于GUI)。这两门课我都做了不少,但我也没有完成。然而,我试图测试从一个类到另一个类的调用方法的实现,这就是我遇到的问题。在GUI类中,我试图在用户每次单击一个框时调用Logic类中的方法openCell(intx,inty)。该逻辑类方法将依次检查方块上是否有地雷、0或数字,并从GUI类调用相应的方法。误差中涉及的两种方法如下:

GUI CLASS
public void mouseClicked(MouseEvent e) {
    for (int x = 0 ; x < width ; x++) {
       for (int y = 0 ; y < height ; y++) {
           if (e.getSource() == table[x][y]) {    
                if(e.getButton() == e.BUTTON1) {
                   MinesweeperLogic logicClass = new MinesweeperLogic();
                   logicClass.isOpen(x, y); // <--------------------------- ERROR
                 }}}}}

LOGIC CLASS
boolean openCell(int x, int y) {
isClicked[x][y] = true;
    if(mine[x][y] == true && flag[x][y]==false) {
        return false;
    } else if(neighborBombs(x, y) > 0 && flag[x][y]==false) {
        return true;
    }else {
            marked = true;
            return marked;
    }}
最后,如果需要的话,到目前为止,两个类的完整代码(目前还不完整)。(逻辑类中的方法需要按照项目说明执行特定操作,并且在逻辑类中必须没有用户交互)。我搞不清楚到底是什么导致了这个错误。任何指导都将不胜感激。(希望这不是什么很明显的事情,因为即使我得了流感,我还是花了几个小时试图弄明白这一点!哈哈)

import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类扫雷器UI扩展JFrame实现ActionListener、MouseListener{
整数宽度=10;
整数高度=10;
JPanel p=新的JPanel();
JButton[][]table=新JButton[宽度][高度];
公共扫雷艇(){
扫雷逻辑类=新扫雷逻辑();
logicClass.StartNewName(宽度、高度);
JButton[]按钮=新JButton[宽度*高度];
GridLayout=新的GridLayout(宽度、高度);
p、 设置布局(布局);
对于(int x=0;xlogicClass.isOpen(x,y);//知道逻辑类中的117行号会很有帮助。我的猜测可能是
我的
我的[x]
标记的
标记的[x]
为空

也就是说,你“在整个表中循环查看哪个被点击”的技巧并没有给我特别的启发

编辑:实际上,问题是
isOpen
数组为空,因为您刚刚实例化了该类


EDIT2:好的,这是我最初列出的一个。我的猜测是所有的,因为您刚刚实例化了这个类,它使用的是默认的不做任何事情构造函数。

知道逻辑类中的117行是什么会很有帮助。我的猜测可能是
我的
我的[x]
标记的
标记的[x]
为空

也就是说,你“在整个表中循环查看哪个被点击”的技巧并没有给我特别的启发

编辑:实际上,问题是
isOpen
数组为空,因为您刚刚实例化了该类

EDIT2:好的,这是我最初列出的一个。我猜是所有的,因为您刚刚实例化了这个类,它使用的是默认的不做任何事情构造函数。

怎么样:

  • 查看异常stacktrace的第一行,查看出现问题的类和行
  • 转到该行,查看在此位置哪些对象可能为“null”
  • 找出空对象没有关联值的原因
  • 如果有多个对象可以为null,您可以
    System.out.println()
    查看它们是什么
  • 那么:

  • 查看异常stacktrace的第一行,查看出现问题的类和行
  • 转到该行,查看在此位置哪些对象可能为“null”
  • 找出空对象没有关联值的原因
  • 如果有多个对象可以为null,您可以
    System.out.println()
    查看它们是什么

  • 数组(flag,isZero,isClicked)未初始化,当您尝试使用它们时为空。您需要GUI类包含逻辑类的实例,并始终使用同一实例。否则,每个GUI操作将在不同的游戏上进行!

    数组(flag,isZero,isClicked)未初始化且在尝试使用时为空。您需要GUI类包含逻辑类的实例并始终使用该实例。否则,每个GUI操作将在不同的游戏上进行!

    stacktrace告诉您:

    线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 在MinesweeperLogic.isOpen(MinesweeperLogic.java:117)

    因此,您可以转到第117行,并确定哪些引用可能为空。(看起来您在stacktrace被获取后在117处添加了一行,然后注释掉了新行,因此我将在这里指出stacktrace实际上是指现在称为第118行的内容:
    isClicked[x][y]=true;
    )在本例中,唯一可以为null的是
    isClicked[][]

    挖一点
     Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
     at MinesweeperLogic.isOpen(MinesweeperLogic.java:117)
     at MineSweeperGUI.mouseClicked(MineSweeperGUI.java:126)
     at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
     at java.awt.Component.processMouseEvent(Component.java:6266)
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
     at java.awt.Component.processEvent(Component.java:6028)
     at java.awt.Container.processEvent(Container.java:2041)
     at java.awt.Component.dispatchEventImpl(Component.java:4630)
     at java.awt.Container.dispatchEventImpl(Container.java:2099)
     at java.awt.Component.dispatchEvent(Component.java:4460)
     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
     at java.awt.Container.dispatchEventImpl(Container.java:2085)
     at java.awt.Window.dispatchEventImpl(Window.java:2475)
     at java.awt.Component.dispatchEvent(Component.java:4460)
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
     at  java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    
    import java.awt.* ;
    import java.awt.event.* ;
    import java.awt.geom.* ;
    import javax.swing.* ;
    import javax.swing.event.* ;
    
    public class MineSweeperGUI extends JFrame implements ActionListener, MouseListener {  
    int width = 10;
    int height = 10;
    JPanel p = new JPanel();
    JButton[][] table = new JButton[width][height];
    
    public void MineSweeper() {
        MinesweeperLogic logicClass = new MinesweeperLogic();
        logicClass.startNewGame(width, height);
        JButton[] button = new JButton[width*height];
        GridLayout layout = new GridLayout (width, height) ;
        p.setLayout(layout);
        for(int x = 0 ; x < width ; x++) {
            for(int y = 0 ; y < height ; y++) {
                table[x][y] = new JButton();
                table[x][y].setPreferredSize(new Dimension(25,25));
                table[x][y].addMouseListener (this);
                p.add(table [x] [y]);
            }
        }       
        this.add(p);
        this.pack();
        this.setVisible(true);
    }
    
    
    public void mouseClicked(MouseEvent e) {
        for (int x = 0 ; x < width ; x++) {
           for (int y = 0 ; y < height ; y++) {
               if (e.getSource() == table[x][y]) {    
                    if(e.getButton() == e.BUTTON1) {
                       MinesweeperLogic logicClass = new MinesweeperLogic();
                       logicClass.isOpen(x, y); //<--------------------------------------
                   }
               }
           }
       }
     }
    public void gameover(int x, int y) {
       table[x][y].setText("*");
    }
    
    public static void main(String[]args) {
        MineSweeperGUI guiClass = new MineSweeperGUI();
        guiClass.MineSweeper();
    }}    
    
    
    public void actionPerformed(ActionEvent e) {
    }
    
    public void mouseEntered(MouseEvent e) {
    }
    
    public void mousePressed(MouseEvent e) {
    }
    
    public void mouseExited(MouseEvent e) {
    }
    
    public void mouseReleased(MouseEvent e) {
    }
    
    
    
    
    public class MinesweeperLogic {
    
    private int w, h, maxBombs, bombsremaining;
    public int width, height;
    private boolean mine[][];
    private boolean flag[][];
    private boolean isClicked[][];
    private boolean isZero[][];
    private boolean marked;
    
    
    
    public void startNewGame(int width, int height) {
        w = width;
        h = height;
        flag = new boolean[w][h];
        isZero = new boolean[w][h];
        isClicked = new boolean[w][h];
        mine = new boolean[w][h];
        maxBombs =(int) Math.floor (width*height*0.15);
        bombsremaining = maxBombs;
        for(int i = 0; i < maxBombs; i++) {
            int x = (int) (Math.random() * (w));
            int y = (int) (Math.random() * (h));
            if (mine[x][y] == false) {
                mine[x][y] = true;
                isClicked[x][y] = false;
                flag[x][y] = false;
            }
        } 
    }
    
    
    int getWidth() {
        return w;
    }
    
    
    int getHeight() {
        return h;
    }
    
    
    boolean openCell(int x, int y) { // <---------------------------------------------
        //MineSweeperGUI guiClass = new MineSweeperGUI();
        isClicked[x][y] = true;
        if(mine[x][y] == true && flag[x][y]==false) {
            //guiClass.gameover(x, y);
            return false;
        } else if(neighborBombs(x, y) > 0 && flag[x][y]==false) {
            return true;
        } else {
                marked = true;
                return marked;
        }}
    
    
     boolean markCell(int x, int y) {
         if(flag[x][y] == true) {
                flag[x][y] = false;
                isClicked[x][y] = false;
                bombsremaining++;
                marked = false;
                return marked;
            } else {
                flag[x][y] = true;
                isClicked[x][y] = true;
                bombsremaining--;
                    if(mine[x][y]==true) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
    
    
     boolean isOpen(int x, int y) {
         if(isClicked[x][y] == false) {
             return false;
            } else {
                return true;
            }
    }
    
    
     boolean isMarked(int x, int y) {
         if(flag[x][y] == true) {
             return true;
            } else {
                return false;
            }
        }
    
    
      int getValue(int x, int y) {
          if(mine[x][y] == true) {
              return -1;
            } else {
                return neighborBombs(x, y);
            }
        }
    
    
        private int neighborBombs(int x, int y) {  // checks surrounding 8 squares for number of bombs 
            int surBombs = 0;
                for (int q = x - 1 ; q <= x + 1 ; q++) {
                    for (int w = y - 1 ; w <= y + 1 ; w++) {
                        while (true) {
                            if (q < 0 || w < 0 || q >= w || w >= h) { 
                                break;
                            }
                            if (mine[q][w] == true) {
                                surBombs++;
                                break;
                            }
                        }   
                    }
                }
             return surBombs;
            }
        }
    
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
     at MinesweeperLogic.isOpen(MinesweeperLogic.java:117)
     at MineSweeperGUI.mouseClicked(MineSweeperGUI.java:126)