Java 如何在不获取NullPointerException的情况下,将int从一个类传递到另一个类并指定两个列表?
[编辑]:我现在将把我所有的代码都插入到这个程序中,因为我已经绝望了,我不知道如何解决我的问题。不仅如此,在我看来(从前面的评论判断),看到整个代码可能会对那些试图帮助我解决这个问题的了不起的人有所帮助 [原帖子开始]: 我目前正在Eclipse中制作一个游戏,以便在学校进行练习。然而,我有两个问题,我似乎无法解决(至少其中一个),我真的需要一些帮助 我有一个3个班的项目;主屏幕创建了一个框架,没有更多,真的。第二个类创建一个包含组件的面板,并使用JTextField从用户处获取一个数字;数字在1到20之间,据我所知,我可以捕捉到任何异常。没问题。 第三个类是第二个面板,其中包含通过单击“继续”打开的组件。我现在需要做的是两件事——这也是我的问题。 1:我需要将指定的数字(它已经转换为int)从类2传递到类3。 2:我需要添加两个列表,大小由数字指定 我相信我在尝试了5个小时后修复了问题1,但我没有找到快速检查的方法,因此我继续处理问题2,在单击“继续”后,我的第三个类导致程序崩溃并抛出NullPointerException。我知道这与清单有关,但我一辈子都无法找出问题所在 下面是一些代码: 第1类:Java 如何在不获取NullPointerException的情况下,将int从一个类传递到另一个类并指定两个列表?,java,arrays,list,class,Java,Arrays,List,Class,[编辑]:我现在将把我所有的代码都插入到这个程序中,因为我已经绝望了,我不知道如何解决我的问题。不仅如此,在我看来(从前面的评论判断),看到整个代码可能会对那些试图帮助我解决这个问题的了不起的人有所帮助 [原帖子开始]: 我目前正在Eclipse中制作一个游戏,以便在学校进行练习。然而,我有两个问题,我似乎无法解决(至少其中一个),我真的需要一些帮助 我有一个3个班的项目;主屏幕创建了一个框架,没有更多,真的。第二个类创建一个包含组件的面板,并使用JTextField从用户处获取一个数字;数字在
package gedigitaliseerd;
import javax.swing.JFrame; //javax = java extra
public class StartFrame extends JFrame //zeg dat het een systeemklasse is.
{
public StartFrame() //constructor
{
setSize(400, 250); //bepaal de grootte
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //met dit is afsluiten van een progje nooit een probleem
setTitle("Game 2-cousins"); //geef een titel mee in de titelbalk
setResizable(false); //nu kan de gebruiker het venster niet vergroten of verkleinen
//centreer het frame op je monitor
setLocationRelativeTo(null);
//hoe laadt je het paneel in het frame?
//maak een paneelklasse om dat te doen
//dit is dus om een koppeling te maken tussen frame en paneel
add(new StartFramePaneel(this /* deze this is nodig voor het paneel en het sluiten van dit frame. this is de class waar hij op dit moment in zit*/)); //waarom ook alweer al die haken?
setVisible(true);
}
public static void main(String[] args) //main method
{
new StartFrame(); //maak nieuw object. je hoeft niet te zeggen frame pietje is new frame. je hoeft geen naam te gebruiken
}
}
// header, constructor, de rest. is makkelijker voor het oog
[现在整个类]底部的class 2(StartFramePaneel)方法,需要传递的是a antalCharacters
。在ActionEvent
中发生的解析没有包含在我下面粘贴的内容中,因为它解析时没有问题。我甚至可以得到一个弹出窗口,询问您是否希望继续使用指定数量的字符;如果单击“继续”按钮。如果您然后单击“是”,没有我所有的传递和列表内容,它将显示下一个面板,但如果我添加我粘贴在下面的所有内容,它将在继续-->是后崩溃
包装gedigitaliseerd
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //voor eventafhandeling
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class StartFramePaneel extends JPanel implements ActionListener
{
private JTextField invoerVeld; //goede naamgeving is heel belangrijk
private JLabel vraagVeld1;
private JLabel vraagVeld2;
private JButton rulesButton;
private JButton stopButton;
private JButton continueButton;
private JPanel gridPanel1;
private JPanel gridPanel2;
private JFrame errorFrame;
private JFrame areUSureFrame;
private JFrame main; //nieuw JFrame met de naam main. voor het sluiten van de main OpstartFrame
private JFrame selectionFrame;
private int continueVraag;
private int stopVraag;
public static int aantalCharacters = 0;
//constructor
public StartFramePaneel(JFrame main)
{
setLayout(new GridLayout(2,1)); //verander de layoutmanager naar GridLayout, van 3x3 even grote cellen
//setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); //laat de Grid opvullen van 1,1 naar 1,2 naar 1,3 naar 2,1 etc
//initialiseren (stappenplan punt 2)
this.main = main; //de mainframe wordt nu toegekend aan de thispanel in de hoofdklasse.
stopButton = new JButton ("Stop");
stopButton.addActionListener(this); //(stappenplan punten 3 en 4; this geeft aan dat dit kopieerpaneel hem afhandeld.)
rulesButton = new JButton ("Rules");
rulesButton.addActionListener(this);
continueButton = new JButton ("Continue");
continueButton.addActionListener(this); //"this" betekent dat dit paneel de zaken afhandeld
//initialisatie
invoerVeld = new JTextField(5); //13 is maximale aantal karakters... meestal werkt dat zo. het is in kolommen. een tekst in quites kun je er ook in neerzetten.
invoerVeld.setHorizontalAlignment(JTextField.CENTER); //centreer de text in het invoerveld
vraagVeld1 = new JLabel("How many characters between 1 and 20 should each player have?");
vraagVeld1.setHorizontalAlignment(JLabel.CENTER); //centreer de JLabel in de layout
vraagVeld2 = new JLabel("(If you don't specify a number, 1 will be the default value)");
vraagVeld2.setHorizontalAlignment(JLabel.CENTER);
gridPanel1 = new JPanel(new GridLayout(3,1)); //object gridPanel1 aanmaken, met dezelfde GridLayout als het hoofdpaneel
gridPanel2 = new JPanel(new GridLayout(1,3));
//zichtbaar maken op het eerste (hoofd)paneel .. een paneel heeft een default en een FlowLayout, nu een GridLayout
add (gridPanel1); //in grid rij 1
add (gridPanel2); //in grid rij 2
//voeg Label en TextField toe aan gridPanel1
gridPanel1.add(vraagVeld1);
gridPanel1.add(vraagVeld2);
gridPanel1.add(invoerVeld);
//voeg de knoppen toe aan gridPanel2
gridPanel2.add (stopButton);
gridPanel2.add (rulesButton);
gridPanel2.add (continueButton);
}
//Deze methode MOET opgenomen worden, omdat er gebruik wordt gemaakt van een ActionListener
public void actionPerformed (ActionEvent ae)
{
if (ae.getSource() == continueButton)
{
try //maak een 'try' blokje aan om ongeldige invoeren tegen te gaan.
{
aantalCharacters = Integer.parseInt(invoerVeld.getText()); //het aantal karakters wordt in aantalCharacters opgeslagen,
//wanneer op continue wordt geklikt. Ook wordt de text eerst in een nummer omgezet
}
catch (NumberFormatException ongeldigeInvoer) //specificeer de exception voor ongeldige invoer
{
//JOptionPane.showMessageDialog(errorFrame, "You must use numbers"); //maak een error aan, zodat het progje niet crasht
invoerVeld.setText("");
aantalCharacters = 1;
}
if (invoerVeld.getText() == "0" || aantalCharacters == 0)
{
JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20");
invoerVeld.setText("");
}
else if (invoerVeld.getText() == "" || aantalCharacters == 0)//hier zit het probleem
{
invoerVeld.setText("");
aantalCharacters = 0;
//JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20");
}
else if (aantalCharacters < 1 || aantalCharacters > 20)
{
JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20"); //maak een error aan, zodat het progje niet crasht
invoerVeld.setText("");
aantalCharacters = 0;
}
else
{//hier wordt er een are you sure neergezet, met een actie die volgt op een ja-optie
continueVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to continue? You selected "+ aantalCharacters + " character(s)");
if (continueVraag == JOptionPane.YES_OPTION)
{
main.setVisible(false); //main is de thispanel in de hoofdklasse en beide worden ze onzichtbaar... geloof ik
selectionFrame = new JFrame();
selectionFrame.setSize(1000, 600);
selectionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
selectionFrame.setLocationRelativeTo(null);
selectionFrame.setTitle("Game 2-cousins");
selectionFrame.add(new SelectionFramePaneel());
selectionFrame.setVisible(true);
}
if (continueVraag == JOptionPane.NO_OPTION)
{
invoerVeld.setText("");
}
if (continueVraag == JOptionPane.CANCEL_OPTION)
{
invoerVeld.setText("");
}
}
//lege vakjes moeten natuurlijk ingevuld zijn!
//nu moet StartFrame sluiten
//nu moet SelectionFrame opstarten
}
if (ae.getSource() == rulesButton)
{
//hier moet iets met de regelknop worden gedaan. Een nieuw frame met regels moet toevoorschijn komen. Die heb ik nog niet gemaakt.
}
if (ae.getSource() == stopButton)
{
/*stopVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to exit?");
if (stopVraag == JOptionPane.YES_OPTION)
{
*/System.exit(0); //het programma sluit af door op 'Stop' the drukken
/*}
if (continueVraag == JOptionPane.NO_OPTION)
{
invoerVeld.setText("");
}
if (continueVraag == JOptionPane.CANCEL_OPTION)
{
invoerVeld.setText("");
}*/
}
}
public static void passCharacters(int aantalCharacters) //maak passCharacters aan, zodat deze aangeroepen kan worden in de 3e class
{
int passCharacters = 0;
passCharacters = aantalCharacters;
}
}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener//voor事件处理
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
公共类StartFramePaneel扩展JPanel实现ActionListener
{
私有JTextField inverveld;//goede naamgeving是heel belangrijk
私人JLabel vraagVeld1;
私人JLabel vraagVeld2;
私有JButton规则按钮;
私人按钮停止按钮;
私有JButton continueButton;
私人JPanel gridPanel1;
私人JPanel gridPanel2;
私有JFrame-errorFrame;
私有JFrame被重新定义;
私有JFrame main;//nieuw JFrame与naam main相接。voor het sluiten van de main OpstartFrame
私有JFrame selectionFrame;
私人int continueVraag;
斯多夫拉格私人酒店;
公共静态int-aantalCharacters=0;
//建造师
公共启动框架(JFrame main)
{
setLayout(新的GridLayout(2,1));//verander de layoutmanager naar GridLayout,van 3x3甚至grote cellen
//setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);//laat de Grid opvullen van 1,1 naar 1,2 naar 1,3 naar 2,1等
//初始化器(stappenplan punt 2)
this.main=main;//de mainframe wordt nu toegekend和de hoofdklasse中的此面板。
stopButton=新按钮(“停止”);
stopButton.addActionListener(此);/(stappenplan punten 3 en 4;此geeft aan dat dit kopieerpaneel hem Afhandled.)
rulesButton=新的JButton(“规则”);
rulesButton.addActionListener(此);
continueButton=新的JButton(“Continue”);
continueButton.addActionListener(this);/“this”用于编辑zaken afhandeld的数据
//草签
INVOVERELD=new JTEXTFELD(5);//13是最大值。他在科洛门。即使是在尼尔泽滕,他也在基茨。
setHorizontalAlignment(JTextField.CENTER);//在het Inverveld中的文本中心
vraagVeld1=新的JLabel(“每个玩家应该有多少个介于1和20之间的角色?”);
vraagVeld1.setHorizontalAlignment(JLabel.CENTER);//在de layout中设置JLabel的中心
vraagVeld2=新的JLabel((如果不指定数字,则默认值为1)”;
vraagVeld2.设置水平对齐(JLabel.中心);
gridPanel1=new JPanel(new GridLayout(3,1));//对象gridPanel1 aanmaken,met dezelfde GridLayout als het hoofdpaneel
gridPanel2=新的JPanel(新的GridLayout(1,3));
//zichtbaar生成一个包含所有元素(hoofd)的窗格。即使窗格包含默认的流程布局,也包含默认的网格布局
添加(gridPanel1);//在网格rij 1中
添加(gridPanel2);//在网格rij 2中
//voeg标签en TextField toe和网格面板1
gridPanel1.添加(vraagVeld1);
gridPanel1.添加(vraagVeld2);
gridPanel1.添加(发票字段);
//诺本之音和网格面板2
gridPanel2.add(停止按钮);
gridPanel2.add(规则按钮);
gridPanel2.add(连续按钮);
}
//这是一种治疗先天性心脏病的方法
已执行的公共无效行动(行动事件ae)
{
如果(ae.getSource()==continueButton)
{
try//maak een'try'blokje aan om ongeldige invoiren tegen te gaan。
{
aantalCharacters=Integer.parseInt(inverveld.getText());//在aantalCharacters选项中指定aantal karakters wordt,
//想要继续使用文字,请使用文字
}
catch(NumberFormatException ongeldigeInvoer)//指定异常voor ongeldigeInvoer
{
//showMessageDialog(errorFrame,“您需要
package gedigitaliseerd;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //voor eventafhandeling
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
public class SelectionFramePaneel extends JPanel implements ActionListener
{
//declareer de componenten (stappenplan punt 1)
private JButton rulesButton;
private JButton stopButton;
private JButton continueButton;
private JCheckBox evenTheFieldP1;
private JCheckBox evenTheFieldP2;
private JPanel northPanel;
private JPanel southPanel;
private JPanel centerPanel;
private JPanel eastPanel;
private JPanel westPanel;
private JLabel player1Label;
private JLabel player2Label;
private JButton player1DiceButton;
private JButton player2DiceButton;
private JLabel player1DiceLabel;
private JLabel player2DiceLabel;
private JLabel dummyLabel1;
private JLabel dummyLabel2;
private JLabel dummyLabel3;
private JList<String> player1List;
private JList<String> player2List;
private static String[] characterArray;
private JLabel kant;
private JLabel ras;
private JLabel basisCharacter;
private JLabel speciaalCharacter1;
private JLabel speciaalCharacter2;
private JLabel speciaalCharacter3;
private JLabel extraVeld1;
private JLabel extraVeld2;
private JLabel extraVeld3;
private JLabel extraVeld4;
private int stopVraag;
private int continueVraag;
public static int gekregenCharacters;
public static int index;
public static void newStartFramePaneel() //maak methode voor het startframepaneel, om passCharacters aan te roepen.
{
StartFramePaneel.passCharacters(gekregenCharacters);
//int gezetteCharacters = gekregenCharacters; //hopelijk krijgt gekregenCharacters hier de waarde van aantalCharacters mee
characterArray = new String[gekregenCharacters];
for (int fill = 0; fill < gekregenCharacters; fill++)
{
characterArray[index]="Character "+index+1;
index++;
}
}
//constructor
public SelectionFramePaneel()
{
setLayout(new BorderLayout()); //verander de layoutmanager naar GridLayout, van 3x3 even grote cellen
//setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); //laat de Grid opvullen van 1,1 naar 1,2 naar 1,3 naar 2,1 etc
//initialiseren (stappenplan punt 2)
stopButton = new JButton ("Stop")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
stopButton.addActionListener(this); //(stappenplan punten 3 en 4; this geeft aan dat dit kopieerpaneel hem afhandeld.)
rulesButton = new JButton ("Rules")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
rulesButton.addActionListener(this);
continueButton = new JButton ("Continue")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
continueButton.addActionListener(this); //"this" betekent dat dit paneel de zaken afhandeld
player1Label = new JLabel ("Player 1");
player1Label.setHorizontalAlignment(JLabel.CENTER);
player2Label = new JLabel ("Player 2");
player2Label.setHorizontalAlignment(JLabel.CENTER);
player1DiceLabel = new JLabel ("0");
player1DiceLabel.setHorizontalAlignment(JLabel.CENTER);
player2DiceLabel = new JLabel ("0");
player2DiceLabel.setHorizontalAlignment(JLabel.CENTER);
dummyLabel1 = new JLabel ("");
dummyLabel2 = new JLabel ("");
dummyLabel3 = new JLabel ("");
player1DiceButton = new JButton ("P1 Roll Dice")
{
public Dimension getPreferredSize()
{
return new Dimension(100,50);
}
};
player1DiceButton.addActionListener(this);
player2DiceButton = new JButton ("P2 Roll Dice")
{
public Dimension getPreferredSize()
{
return new Dimension(100,50);
}
};
player2DiceButton.addActionListener(this);
evenTheFieldP1 = new JCheckBox ("Even the playing field P1");
evenTheFieldP2 = new JCheckBox ("Even the playing field P2");
evenTheFieldP2.setHorizontalTextPosition(SwingConstants.LEFT);
evenTheFieldP2.setHorizontalAlignment(SwingConstants.RIGHT);
player1List = new JList<String>(characterArray); //maak de lijsten aan met (hopelijk) de arrays van grootte aantalCharacters->gekregenCharacters
player1List.setVisibleRowCount(10); //zorg dat er standaard 10 regels in del ijsten te zien zijn
player1List.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //zorg dat altijd maar 1 element geselecteerd kan worden
player2List = new JList<String>(characterArray);
player2List.setVisibleRowCount(10);
player2List.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
extraVeld1 = new JLabel();
extraVeld2 = new JLabel();
extraVeld3 = new JLabel();
extraVeld4 = new JLabel();
kant = new JLabel("Side");
kant.setHorizontalAlignment(JLabel.CENTER);
ras = new JLabel("Category");
ras.setHorizontalAlignment(JLabel.CENTER);
basisCharacter = new JLabel("Character");
basisCharacter.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter1 = new JLabel("");
speciaalCharacter1.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter2 = new JLabel("");
speciaalCharacter2.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter3 = new JLabel("");
speciaalCharacter3.setHorizontalAlignment(JLabel.CENTER);
northPanel = new JPanel(new GridLayout(3,3));
southPanel = new JPanel(new GridLayout(1,5));
centerPanel = new JPanel(new GridLayout(6,1));
eastPanel = new JPanel(new GridLayout(3,1));
westPanel = new JPanel(new GridLayout(3,1));
southPanel.setSize(999,150);
northPanel.setSize(999,150); //deze grootte aanpassen als het scherm vergroot wordt.
add (northPanel, BorderLayout.NORTH); //een grid met nieuwe panels, met daarin de dobbelsteenvakjes en player labels en Roll Dice knoppen gaan hierin
add (southPanel, BorderLayout.SOUTH); //de knoppen gaan hierin
add (centerPanel, BorderLayout.CENTER); //de selectionlabels gaan hierin
add (eastPanel, BorderLayout.EAST); //het selectievak met aantal characters voor player 2 gaat hierin
add (westPanel, BorderLayout.WEST); //het selectievak met aantal characters voor player 1 gaat hierin
northPanel.add(player1Label);
northPanel.add(dummyLabel1);
northPanel.add(player2Label);
northPanel.add(player1DiceLabel);
northPanel.add(dummyLabel2);
northPanel.add(player2DiceLabel);
northPanel.add(player1DiceButton);
northPanel.add(dummyLabel3);
northPanel.add(player2DiceButton);
southPanel.add(evenTheFieldP1);
southPanel.add(stopButton);
southPanel.add(rulesButton);
southPanel.add(continueButton);
southPanel.add(evenTheFieldP2);
westPanel.add(player1List);
westPanel.add(extraVeld1);
westPanel.add(extraVeld2);
eastPanel.add(player2List);
eastPanel.add(extraVeld3);
eastPanel.add(extraVeld4);
centerPanel.add(kant);
centerPanel.add(ras);
centerPanel.add(basisCharacter);
centerPanel.add(speciaalCharacter1);
centerPanel.add(speciaalCharacter2);
centerPanel.add(speciaalCharacter3);
}
//Deze methode MOET opgenomen worden, omdat er gebruik wordt gemaakt van een ActionListener
public void actionPerformed (ActionEvent ae)
{
if (ae.getSource() == continueButton)
{
}
if (ae.getSource() == rulesButton)
{
//hier moet iets met de regelknop worden gedaan. Een nieuw frame met regels moet toevoorschijn komen. Die heb ik nog niet gemaakt.
}
if (ae.getSource() == stopButton)
{
/*stopVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to exit?");
if (stopVraag == JOptionPane.YES_OPTION)
{
*/System.exit(0); //het programma sluit af door op 'Stop' the drukken
/*}
else
{
}*/
}
}
}
private static String[] characterArray;