簡體   English   中英

當我嘗試從getter獲取數據時,為什么會出現NullPointerException?

[英]Why am I getting a NullPointerException when I try to get data from a getter?

編輯:好的,這是我的完整代碼,因為你們要求它:

import javax.swing.*;
import java.awt.*;

public class Panel extends JPanel {

private JTextField username_field;
private JTextField skype_field;
private JTextField raidcall_field;
private JTextField teamspeak_field;
private JComboBox server_combobox;
private JComboBox levels_combobox;
private JComboBox mytier_combobox;
private JComboBox mydiv_combobox;
private JComboBox partner_tier_combobox;
private JComboBox partner_div_combobox;
private JComboBox myrole_combobox;
private JComboBox partner_role_combobox;
private JRadioButton normal,ranked;
private String region;
private String tier;
private String division;
private String skype;
private String raidcall;
private String teamspeak;
private String partner_role;
private int mode;

public Panel(AppUI.Panels panel){

    String star = "<span style='color:#ff0000;'>*</span>";

    switch (panel) {

        case NORTHPANEL :
            setBackground(Color.getHSBColor(20,20,20));
            JLabel title = new JLabel();
            title.setText("<html>fields marked with " + star + " are required to be filled.</html>");
            title.setFont(new Font("Tahoma", Font.BOLD, 10));
            add(title);

            break;

        case CENTERPANEL :

            setLayout(new GridBagLayout());
            setBackground(Color.LIGHT_GRAY);
            username_field = new JTextField(10);
            username_field.setToolTipText("Enter your Summoner name here");

            String[] servers = { "NA", "EUW", "EUNE", "TR", "BR", "LAN", "LAS", "RU", "OCE" };
            server_combobox = new JComboBox<String>(servers);
            server_combobox.setToolTipText("Select the region your account is in");

            String[] levels = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"
                    ,"17","18","19","20","21","22","23","24","25","26","27","28","29","30"};
            levels_combobox = new JComboBox<String>(levels);
            levels_combobox.setToolTipText("Select the level your summoner is");

            addItem(this, new JLabel("<html>Summoner name :" + star + "</html>") , 0, 0, 1, 1);
            addItem(this, username_field ,1,0,1,1);
            addItem(this, new JLabel("<html>Summoner level :" + star + "</html>"), 0,1,1,1);
            addItem(this, levels_combobox, 1,1,1,1);
            addItem(this, new JLabel("<html>Server :" + star + " </html>"), 0,2,1,1);
            addItem(this, server_combobox, 1, 2, 1, 1);

            break;

        case SOUTHPANEL :

            JLabel require = new JLabel();
            JLabel require1 = new JLabel();
            JLabel require2 = new JLabel();


            setLayout(new GridBagLayout());
            setBackground(Color.getHSBColor(20,20,20));
            ButtonGroup bg = new ButtonGroup();
            normal = new JRadioButton("Normal game");
            ranked = new JRadioButton("Solo/Duo Ranked game");
            bg.add(normal);
            bg.add(ranked);

            Box queue = Box.createHorizontalBox();
            queue.add(new JLabel("<html>I want to play a :" + star + "</html>"));
            queue.add(Box.createHorizontalStrut(5));
            queue.add(normal);
            queue.add(ranked);

            String[] tiers = {"Bronze", "Silver" , "Gold", "Platinum", "Diamond"};
            String[] divs = {"I", "II", "III", "IV", "V"};

            mytier_combobox = new JComboBox<>(tiers);
            mydiv_combobox = new JComboBox<>(divs);

            Box myRank = Box.createHorizontalBox();
            myRank.add(new JLabel("<html>My Solo Queue rank is : "));
            myRank.add(require);
            myRank.add(Box.createHorizontalStrut(15));
            myRank.add(mytier_combobox);
            myRank.add(Box.createHorizontalStrut(15));
            myRank.add(mydiv_combobox);

            String[] myroles = {"Jungler", "Top laner", "Mid laner", "ADC", "Support"};
            String[] partner_roles = {"Jungler", "Top laner", "Mid laner", "ADC", "Support"};

            myrole_combobox = new JComboBox<>(myroles);
            partner_role_combobox = new JComboBox<>(partner_roles);

            Box roles = Box.createHorizontalBox();
            roles.add(new JLabel("I am a "));
            roles.add(Box.createHorizontalStrut(5));
            roles.add(myrole_combobox);
            roles.add(Box.createHorizontalStrut(5));
            roles.add(new JLabel("<html>" + star + " Looking for a </html>"));
            roles.add(Box.createHorizontalStrut(5));
            roles.add(partner_role_combobox);
            roles.add(require1);

            partner_tier_combobox = new JComboBox<>(tiers);
            partner_div_combobox = new JComboBox<>(divs);

            Box partner_min_rank = Box.createHorizontalBox();
            partner_min_rank.add(new JLabel("Looking for a partner with a minimum rank of "));
            partner_min_rank.add(require2);
            partner_min_rank.add(Box.createHorizontalStrut(5));
            partner_min_rank.add(partner_tier_combobox);
            partner_min_rank.add(Box.createHorizontalStrut(5));
            partner_min_rank.add(partner_div_combobox);

            JButton button = new JButton("Results");
            button.addActionListener(e -> {
                System.out.println("[TEST] Your summoner level is : " + getLevel());
            });
            addItem(this, queue, 0, 0, 1, 1);
            addItem(this, myRank , 0, 1, 1, 1);
            addItem(this, roles, 0, 2, 1, 1);
            addItem(this, partner_min_rank, 0, 3, 1, 1);
            addItem(this, button, 0, 4, 1,1);

            ranked.addActionListener(e -> {
                if (ranked.isSelected()){

                    require.setText("<html>"+ star + "</html>");
                    require1.setText("<html>" + star + "</html>");
                    require2.setText("<html>"+ star + "</html>");
                }
            });

            normal.addActionListener(e -> {
                if (normal.isSelected()){

                    require.setText("");
                    require1.setText("");
                    require2.setText("");
                }
            });

            break;

        case EASTPANEL :

            setLayout(new GridBagLayout());

            skype_field = new JTextField(5);
            raidcall_field = new JTextField(5);
            teamspeak_field = new JTextField(5);

            Box skype= Box.createHorizontalBox();
            skype.add(new JLabel(" Username :"));
            skype.add(Box.createHorizontalStrut(5));
            skype.add(skype_field);
            skype.setBorder(BorderFactory.createTitledBorder("Skype"));

            Box raidcall = Box.createHorizontalBox();
            raidcall.add(new JLabel("Username :"));
            raidcall.add(Box.createHorizontalStrut(5));
            raidcall.add(raidcall_field);
            raidcall.setBorder(BorderFactory.createTitledBorder("Raidcall"));

            Box teamspeak = Box.createHorizontalBox();
            teamspeak.add(new JLabel("Username :"));
            teamspeak.add(Box.createHorizontalStrut(5));
            teamspeak.add(teamspeak_field);
            teamspeak.setBorder(BorderFactory.createTitledBorder("Teamspeak"));

            addItem(this, skype, 0, 0, 1, 1);
            addItem(this, raidcall, 0, 1, 1, 1);
            addItem(this, teamspeak, 0, 2, 1, 1);
            break;

        default :
            System.out.println("Panel not found!");
    }

}

public String getSummonerName(){

    return username_field.getText();
}

public int getLevel(){

    return this.levels_combobox.getSelectedIndex() + 1;
}

public String getTier() {

    switch (mytier_combobox.getSelectedIndex()) {
        case 0 :
            tier = "Bronze";
            break;
        case 1 :
            tier = "Silver";
            break;
        case 2 :
            tier = "Gold";
            break;
        case 3 :
            tier = "Platinum";
            break;
        case 4 :
            tier = "Diamond";
            break;

        default :
            System.out.println("Tier not found!");

    }

    return tier;
}

public String getDivision(){

    switch (mydiv_combobox.getSelectedIndex()){
        case 0 :
            division = "I";
            break;
        case 1 :
            division = "II";
            break;
        case 2 :
            division = "III";
            break;
        case 3 :
            division = "IV";
            break;
        case 4 :
            division = "V";
            break;

        default :
            System.out.println("Division not found!");
    }

    return division;
}

public String getRegion(){

    switch (server_combobox.getSelectedIndex()) {
        case 0 :
            region = "North America";
            break;
        case 1 :
            region = "Europe West";
            break;
        case 2 :
            region = "Europe Nordic & East";
            break;
        case 3 :
            region = "Turkey";
            break;
        case 4 :
            region = "Brazil";
            break;
        case 5 :
            region = "Latin America North";
            break;
        case 6 :
            region = "Latin America South";
            break;
        case 7 :
            region = "Russia";
            break;
        case 8 :
            region = "Oceania";
            break;

        default :
            System.out.println("Region not found!");
    }

    return region;
}

public int getGameMode(){

    if (normal.isSelected()){

        mode = 0;

    } else {

        mode = 1;

    }

    return mode;
}

public String getSkype() {

    if (skype_field.getText().isEmpty())
        skype = "Not specified";
    else
        skype = skype_field.getText();

    return skype;
}

public String getRaidcall(){

    if (raidcall_field.getText().isEmpty())
        raidcall = "Not specified";
    else
        raidcall = raidcall_field.getText();

    return raidcall;

}

public String getTeamspeak(){

    if (teamspeak_field.getText().isEmpty())
        teamspeak = "Not specified";
    else
        teamspeak = teamspeak_field.getText();

    return teamspeak;
}

public String getMyRole(){

    String myrole = "";

    switch (myrole_combobox.getSelectedIndex()){

        case 0 :
            myrole = "Jungler";
            break;
        case 1 :
            myrole = "Top laner";
            break;
        case 2 :
            myrole = "Mid laner";
            break;
        case 3 :
            myrole = "ADC";
            break;
        case 4 :
            myrole = "Support";
            break;
        default :
            System.out.println("Role not found!");

    }

    return myrole;
}

public String getPartnerRole(){
    switch (partner_role_combobox.getSelectedIndex()){

        case 0 :
            partner_role = "Jungler";
            break;
        case 1 :
            partner_role = "Top laner";
            break;
        case 2 :
            partner_role = "Mid laner";
            break;
        case 3 :
            partner_role = "ADC";
            break;
        case 4 :
            partner_role = "Support";
            break;
        default :
            System.out.println("Role not found!");
    }

    return partner_role;
}

public String getPartnerMinTier(){
    String tier = "";

    switch(partner_tier_combobox.getSelectedIndex()){
        case 0 :
            tier = "Bronze";
            break;
        case 1 :
            tier = "Silver";
            break;
        case 2 :
            tier = "Gold";
            break;
        case 3 :
            tier = "Platinum";
            break;
        case 4 :
            tier = "Diamond";
            break;
        default :

            System.out.println("Tier not found!");
    }

    return tier;
}

public String getPartnerMinDiv(){
    String div = "";

    switch (partner_div_combobox.getSelectedIndex()){
        case 0 :
            div = "I";
            break;
        case 1 :
            div = "II";
            break;
        case 2 :
            div = "III";
            break;
        case 3 :
            div = "IV";
            break;
        case 4 :
            div = "V";
            break;
        default :
            System.out.println("Division not found!");
    }

    return div;
}

public void addItem(JPanel p, JComponent c, int x, int y, int width, int height){

    GridBagConstraints gc = new GridBagConstraints();
    gc.gridx = x;
    gc.gridy = y;
    gc.gridwidth = width;
    gc.gridheight = height;
    gc.insets = new Insets(5,5,5,5);
    gc.fill = GridBagConstraints.NONE;
    p.add(c, gc);
}

}

好吧,我有這個吸氣劑:

public int getLevel(){
    return levels_combobox.getSelectedIndex() + 1;
}

這是我的變量levels_combobox:

private JComboBox levels_combobox;

是的,它在一個方法中實例化:

String[] levels = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"
                    ,"17","18","19","20","21","22","23","24","25","26","27","28","29","30"};
levels_combobox = new JComboBox<String>(levels);

當我嘗試使用以下方法測試輸出時,為什么會出現NullPointerException:

System.out.println("[TEST] Your summoner level is : " + getLevel());

您正在初始化switch語句的case塊內的JComboBox,在調用有問題的方法之前無法保證被調用。

解決方案:您的代碼設計很糟糕,因此您必須修復它。 初始化構造函數中的所有關鍵組件,而不依賴於switch / case塊。

我不確定為什么你在構造函數中有這樣的switch語句,因為它看起來很奇怪和危險,我建議你考慮重新設計你的構造函數,這樣就不需要了。 也許你真的想要創建某種工廠。


編輯
您的Panel代碼試圖做太多,並且不遵守Single責任原則

每個班級都應該承擔一項責任,而且責任應該完全由班級封裝。 其所有服務應與該責任嚴格一致。

順便說一下,我會重新命名Panel類,以便該名稱不會與同名的核心Java類java.awt.Panel類沖突。 如果您解決了這個問題,將不再需要您的switch / case語句,並且您的錯誤可能會消失。


作為第二個,我敢打賭你使用的枚舉看起來像這樣:

class AppUI {
   enum Panels {
      NORTHPANEL, CENTERPANEL, SOUTHPANEL, EASTPANEL
   }
}

除非你通過了CENTERPANEL,否則你不會指定levels_combobox。 您應該在構造函數的開頭給它一些默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM