簡體   English   中英

線程“ AWT-EventQueue-0”中的異常java.lang.NullPointerException-我應該重置數組嗎? 如何?

[英]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException - Should I Reset Array? and How?

首先,抱歉英語不好。 所以我有這段代碼,用於打印后綴轉換器的中綴。 我使用Netbeans構建它,並生成了所有GUI。

每次我輸入中綴,然后按轉換,它就可以完美地工作。 然后,我使用了重置按鈕。 當我單擊它並嘗試放入該綴並再次進行轉換時,它在線程“ AWT-EventQueue-0” java.lang.NullPointerException中顯示異常。

這就是我的想法(對不好的編碼美感和印度尼西亞語言深表歉意):

package stack;
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.lang.Character;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JFrame extends javax.swing.JFrame {
boolean textState = false;

static char[] inputArray;
public static Scanner input;
    public static String arrayPrint;

static ArrayList<Character> output = new ArrayList();;
public static int tinggiPostfix;
public static int counter;
    public static int sisaArray = 0;
public static int pembatas = 1;
    public static int counterOutput = 0;

    // *** Flipping Array *** //
    public static void flipInPlace(Object[][] theArray) {
    for(int i = 0; i < (theArray.length / 2); i++) {
        Object[] temp = theArray[i];
        theArray[i] = theArray[theArray.length - i - 1];
        theArray[theArray.length - i - 1] = temp;
    }
}

// *** Proses pengubahan infix ke postfix
    public static char[] prosesPerbaris(char[] notasi, int jumlahBaca){
    char[] hasilPerbaris = new char[jumlahBaca];
    Stack inputStack;
    inputStack = new Stack();
            inputStack.clear();
            inputStack.removeAllElements();
    if(!inputStack.isEmpty()) {inputStack.removeAllElements();}
    else{inputStack.removeAllElements();}

    for(int i = 0; i < jumlahBaca; i++)
    {
        if(inputStack.isEmpty() && !Character.isLetterOrDigit(notasi[i]))
        {
            inputStack.push(notasi[i]);     
        }
        else if(notasi[i] =='(' && !Character.isLetterOrDigit(notasi[i]))
        {
            inputStack.push(notasi[i]);
        }

        else if(Character.isLetterOrDigit(notasi[i]))
        {

            prosesOutput(notasi[i], jumlahBaca);
        }

        else if(notasi[i] == ')')
        {
            while(inputStack.isEmpty() == false && Character.valueOf((Character) inputStack.peek()) !='(')
            {
                if(inputStack.isEmpty() == false){
                prosesOutput(Character.valueOf((Character) inputStack.pop()), jumlahBaca);
                }
                else{
                    continue;
                }
            }
            if(inputStack.isEmpty() == false){
                inputStack.pop();
            }
            else{
                continue;
            }

        }
        else if(pickOperator(notasi[i]))
        {
            char teratas = Character.valueOf((Character) inputStack.peek());
            if(teratas == '(' && !Character.isLetterOrDigit(notasi[i]))
            {

                inputStack.push(notasi[i]);

            }
            else
            {
                if(Character.isLetterOrDigit(teratas))
                {
                    prosesOutput(notasi[i], jumlahBaca);
                }
                else if(teratas == ' '){
                    inputStack.pop();
                    inputStack.push(notasi[i]);
                }
                else if(cekOP(teratas) < cekOP(notasi[i]))
                {
                    inputStack.push(notasi[i]);
                }
                else if(cekOP(teratas) > cekOP(notasi[i]) || cekOP(teratas) == cekOP(notasi[i]))
                {

                    while(!inputStack.isEmpty() && pickOperator(teratas)){
                        prosesOutput(Character.valueOf((Character) inputStack.pop()), jumlahBaca);
                    }
                    inputStack.push(notasi[i]);

                }
            }
        }

        else
        {
            while(!inputStack.isEmpty())
            {
                prosesOutput(Character.valueOf((Character) inputStack.pop()), jumlahBaca);
            }
            break;
        }

}

    for(int i = 0; i< inputStack.size(); i++){
        if(!inputStack.isEmpty()){
            hasilPerbaris[i] = Character.valueOf((Character) inputStack.toArray()[i]);

        }
        else{
            break;
        }
    }

    return hasilPerbaris;
}

// *** Proses ngeprint hasil Akhir *** //
public static void prosesOutput(char hasil, int iterasi)
{
    if(hasil!='(' && iterasi >= inputArray.length && output.size() < inputArray.length)
    {
            output.add(hasil);
    }
    else{

    }
}

    // *** Ngecek operator atau bukan. Kalau iya, return true. Untuk validasi *** //
public static boolean pickOperator(char op){
    if(op == '+' || op == '-' || op == '/' || op == '^' || op == '*') {
        return true;
    }
    return false;
}

    // *** Nentuin operator mana yang pangkatnya lebih besar dari operator lain *** //
static int cekOP(char op){
    switch(op){
        case '+':
        case '-':
            return 0;
        case '*':
        case '/':
            return 1;
        case '^':
            return 2;
        default:
            throw new IllegalArgumentException("Operator "+ op +" tidak ada");

    }
}


public JFrame() {
    initComponents();
}

/**
 * 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() {

    jPanel1 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jLabel1 = new javax.swing.JLabel();
    jButton1 = new javax.swing.JButton();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jButton2 = new javax.swing.JButton();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    jMenuItem1 = new javax.swing.JMenuItem();
    jMenuItem2 = new javax.swing.JMenuItem();
    jMenu2 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Infix to Postfix Converter");
    setMaximumSize(new java.awt.Dimension(700, 400));
    setMinimumSize(new java.awt.Dimension(700, 400));
    setResizable(false);

    jTextField1.setText("Masukkan notasi infix disini, kemudian diakhiri dengan tanda \";\" (Tanpa kutip)");
    jTextField1.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
    jTextField1.setDoubleBuffered(true);
    jTextField1.setRequestFocusEnabled(false);
    jTextField1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jTextField1MousePressed(evt);
        }
    });

    jLabel1.setText("Masukkan notasi Infix:");

    jButton1.setText("Convert");
    jButton1.setRequestFocusEnabled(false);
    jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jButton1MousePressed(evt);
        }
    });

    jTextArea1.setEditable(false);
    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jTextArea1.setEnabled(false);
    jScrollPane2.setViewportView(jTextArea1);

    jButton2.setText("Reset");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane2)
                .addComponent(jLabel1)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
            .addContainerGap())
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel1)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton1)
                .addComponent(jButton2))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
            .addContainerGap())
    );

    jMenu1.setText("File");

    jMenuItem1.setText("About");
    jMenuItem1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jMenuItem1MousePressed(evt);
        }
    });
    jMenu1.add(jMenuItem1);

    jMenuItem2.setText("Exit");
    jMenuItem2.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mousePressed(java.awt.event.MouseEvent evt) {
            jMenuItem2MousePressed(evt);
        }
    });
    jMenu1.add(jMenuItem2);

    jMenuBar1.add(jMenu1);
    jMenuBar1.add(jMenu2);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );

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


private void jMenuItem1MousePressed(java.awt.event.MouseEvent evt) {                                        
   JOptionPane.showMessageDialog(null, "\t\tAbout Us\n"
            + "Afriandri Prima Utama\n"
            + "Andika Demas Riyandi\n"
            + "Chriscel Novian\n"
            + "Denny Aditya P\n"
            + "Rizka Yulia Sukma\n"
            + "Rendytio Arifian P\n"
            + "Thomi Alghani\n\n"
            + "Ini adalah program simple untuk mengubah notasi Infix "
            + "menjadi notasi Postfix.\n\n"
            + "Copyright 2IA01 (C) 2016");
}                                       

private void jMenuItem2MousePressed(java.awt.event.MouseEvent evt) {                                        
    System.exit(1);
}                                       

private void jButton1MousePressed(java.awt.event.MouseEvent evt) {                                      
    // The battle begins. Penginputan soal, pengecekan tanda kurung, dan titik koma. //
        int i, j = 0;
        if (jTextField1.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Masukkanlah notasi infix dengan benar!");
        }
        else if (!jTextField1.getText().isEmpty() && !jTextField1.getText().endsWith(";")) {
            JOptionPane.showMessageDialog(null, "Akhiri notasi infix dengan tanda titik koma!");
        } else {
        jTextArea1.enable();
        jTextArea1.setText("");
        jTextArea1.append("Masukkan Notasi Postfix yang diinginkan (akhiri notasi dengan tanda \" ; \" : ");
        jTextArea1.append(jTextField1.getText());

        jTextArea1.append("\n");
        inputArray = jTextField1.getText().toCharArray();
    for(i = 0; i < inputArray.length; i++)
    {
        if(inputArray[i] == '(' || inputArray[i] == ')' || inputArray[i] == ';') 
            {
            counterOutput++;
            }
        else{
            continue;
        }

    }

            // Proses pembuatan matriks Postfix, menambahkan isi JTextArea1 //
    char[][] tempFinal = new char[inputArray.length][inputArray.length];
    for(i = 0; i < inputArray.length;i++){
        for(j = 0; j < pembatas; j++){
            tempFinal[j][i] = prosesPerbaris(inputArray,pembatas)[j];
        }
        pembatas++;
    }       
    jTextArea1.append("Notasi yang diamati adalah = \n");
    for(i = 0; i < inputArray.length-1;i++){
        jTextArea1.append(inputArray[i] + " ");
    }
            jTextArea1.append("\n");

            // Real Process ada disini. Masukkin elemen kedalam Stack //
            char [][] hasilFinal = new char [tempFinal.length][tempFinal.length];
    ArrayList<Character>[][] tempFinal2 = new ArrayList[tempFinal.length][tempFinal.length];

    for(i = 0; i < tempFinal2.length;i++)
    {
        for(j = 0; j < tempFinal2.length; j++)
        {
            tempFinal2[i][j] = new ArrayList<>();
        }

    }
    for(i = 0; i < tempFinal2.length;i++)
    {
        for(j = 0; j < tempFinal2.length; j++)
        {
            if(tempFinal[i][j] == '\u0000')
            {
                tempFinal2[i][j].add(' ');
            }
            else
            {
                tempFinal2[i][j].add(tempFinal[i][j]);  
            }   
        }   
    }

            // Saatnya Stack dibalik! //
            flipInPlace(tempFinal2);

            // Tidak afdhol kalau tidak di print kembali matriksnya //
            for( i = 0; i < tempFinal2.length; i++) {
        for( j = 0; j < tempFinal2.length; j++) {
            jTextArea1.append(tempFinal2[i][j].toString().replaceAll("[\\[\\]]", "") + " ");
        }
            jTextArea1.append("\n\n");
    }   

            // Tentu saja, jangan lupakan Output terakhirnya juga //
            jTextArea1.append("Outputnya adalah =  \n");
    for(i=0; i < inputArray.length-counterOutput;i++){
        jTextArea1.append(output.get(i).toString().replaceAll("[\\,]", "") + ' ');
            }

            jTextField1.disable();}
}                                     

private void jTextField1MousePressed(java.awt.event.MouseEvent evt) {                                         
    if (textState == false) {
        textState = true;
        jTextField1.setText("");
    }
}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    jTextArea1.setText(null);
    jTextArea1.disable();
    jTextField1.setText(null);
    jTextField1.enable();
    jTextField1.setEditable(true);
    jTextField1.requestDefaultFocus();
    inputArray = null;
    output = null;
    textState = false;

}                                        
/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(JFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(JFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(JFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(JFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
// End of variables declaration                   
}

對於您的信息,我的組件是:
jTextArea1
jTextField1
用於轉換的jButton1
重置的jButton2

期待得到答案。 謝謝!

很難毫無例外地分辨出堆棧跟蹤,但是我認為問題出在output = null;的行中output = null; jButton2ActionPerformed事件處理程序中。 我相信這會在這一行的prosesOutput方法內導致NullPointerException

if(hasil!='(' && iterasi >= inputArray.length && output.size() < inputArray.length)

而不是執行output = null ,請嘗試使用output.clear() (如果您打算清除列表)。

如果這樣做不能解決您的問題,請發布該異常的完整堆棧跟蹤。

暫無
暫無

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

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