2017-02-18 14 views
0

Я выполняю задание для класса, требующего, чтобы я выбрал исключение RuntimeException, если пользователь вводит недопустимый символ. Этот ввод будет использоваться для преобразования выражения, которое находится в post fix-notation для инфикса. Теперь у меня завершено мое задание, но я не могу заставить RuntimeException правильно поймать. Я попытался создать исключение InvalidCharacterException, но это ничего не поймает.InvalidCharacterException не улавливающие символы

Что я спрашиваю, почему мой метод не ловить символов и бросать исключение Вот мои классы для справки

ПостфиксноеВыражение

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.*; 
import java.util.*; 

public class postfixExpression extends JPanel 
{ 
    private JFrame frame;//The frame 
    private JPanel panel;//The panel 
    private JLabel enterPostfix; 
    private JTextField postfixExpression; 
    private JButton construct; 
    private JButton blank; 
    private JLabel results; 
    private JTextField resultsDisplay; 





    //Builds the GUI 
    public postfixExpression() 
    { 
     frame=new JFrame("Three Address Generator"); 
     panel=new JPanel(); 
     enterPostfix=new JLabel("Enter Postfix Expression"); 
     postfixExpression=new JTextField(""); 
     construct=new JButton("Construct Tree"); 
     blank=new JButton(); 
     results=new JLabel("Infix Expression"); 
     resultsDisplay=new JTextField(""); 







     construct.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       try 
       { 
        String expression=postfixExpression.getText(); 
        char[] charArray=expression.toCharArray(); 
        treeBuilder et=new treeBuilder(); 
        Node root=et.buildTree(charArray); 
        resultsDisplay.setText(treeBuilder.inorder(root)); 
        root=et.insertRegisters(charArray); 
        et.writeInstructions(root); 
       } 
       catch(InvalidCharacterException i) 
       { 
        JOptionPane.showMessageDialog(null, "Invalid character"); 
       } 

      } 
     }); 



      //Adding the parts together 
     panel.setLayout(new GridLayout(3,2)); 
     panel.add(enterPostfix); 
     panel.add(postfixExpression); 
     panel.add(construct); 
     panel.add(blank); 
     panel.add(results); 
     panel.add(resultsDisplay); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setSize(600,300); 
     frame.setBackground(Color.red); 
     frame.setVisible(true);; 





    }   






    //Main method 
    public static void main(String[] args) 
    { 
     postfixExpression myGUI=new postfixExpression(); 
    } 
} 

treeBuilder

import java.io.*; 
import java.util.*; 
public class treeBuilder 
{ 

//Checks if the current character is an operator 
public boolean isOperator(char c) 
{ 
    return Character.isDigit(c); 
} 

//Checks if the current character is an Integer 
public boolean isInteger(char c) 
{ 
    int test=Character.getNumericValue(c); 
    Integer test2=(Integer)test; 

    if(test2 instanceof Integer) 
    { 
     return true; 
    } 
    return false; 
} 
public static String inorder(Node t) 
{ 
    if(t!=null) 
    { 
     return "("+inorder(t.getLeft())+t.getValue()+" "+inorder(t.getRight())+")"; 
    } 
    return ""; 
} 

public Node buildTree(char postFix[]) throws RuntimeException 
{ 
    Stack<Node> nodeStack=new Stack<Node>(); 
    Node tree=null; 
    Node t1=null; 
    Node t2=null; 

    for(int i=0;i<postFix.length;i++) 
    { 
     if(!isOperator(postFix[i])&&!isInteger(postFix[i])) 
     { 
      throw new InvalidCharacterException(postFix[i]); 

     } 
     if(!isOperator(postFix[i])) 
     { 
      tree=new Node(postFix[i]); 
      nodeStack.push(tree); 
     } 
     else if(isOperator(postFix[i])) 
     { 
      tree= new Node(postFix[i]); 
      t1=nodeStack.pop(); 
      t2=nodeStack.pop(); 
      tree.setRight(t1); 
      tree.setLeft(t2); 
      nodeStack.push(tree); 
     } 
     else if(!isOperator(postFix[i])&& !isInteger(postFix[i])) 
     { 
      throw new InvalidCharacterException(postFix[i]); 
     } 


    } 
    tree=nodeStack.pop(); 
    return tree; 
} 


public Node insertRegisters(char[] postFix) 
{ 
    Stack<Node> nodeStack=new Stack<Node>(); 
    Node tree=null; 
    Node t1=null; 
    Node t2=null; 
    int registerCount=0; 
    for(int i=0;i<postFix.length;i++) 
    { 
     if(!isOperator(postFix[i])) 
     { 
      tree=new Node(postFix[i]); 
      nodeStack.push(tree); 
     } 
     else if(isOperator(postFix[i])) 
     { 
      tree = new Node(postFix[i], "R" + registerCount++); 
      t1 = nodeStack.pop(); 
      t2 = nodeStack.pop(); 
      tree.setRight(t1); 
      tree.setLeft(t2); 
      nodeStack.push(tree); 
     } 

    } 
    return tree; 
} 


public String writeInstructionsHelper(Node root) 
{ 
    String str=""; 
    if(root != null) 
    { 
     if(root.getLeft()!=null && root.getLeft().getRegister() !=null) 
     { 
      str += writeInstructionsHelper(root.getLeft()); 
     } 
     if(root.getRight()!=null && root.getRight().getRegister() !=null) 
     { 
      str += writeInstructionsHelper(root.getRight()); 
     } 

     String instructions=null; 
     if(root.getValue()=='+') 
     { 
      instructions="Add"; 
     } 
     else if(root.getValue()=='-') 
     { 
      instructions="Sub"; 
     } 
     else if(root.getValue()=='*') 
     { 
      instructions="Mul"; 
     } 
     else if(root.getValue()=='/') 
     { 
      instructions="Div"; 
     } 

     if(root.getRegister()==null) 
     { 
      str+=root.getValue(); 
     } 
     else 
     { 
      str += instructions + " "; 
      str += root.getRegisterOrValue() + " "; 
      str += root.getLeft().getRegisterOrValue() + " "; 
      str += root.getRight().getRegisterOrValue(); 
     } 
    } 
    str+="\r\n"; 
    return str; 
} 

public void writeInstructions(Node root) 
{ 
    String file="myFile.txt"; 
    try 
    { 
     String instructions = writeInstructionsHelper(root); 
     PrintWriter outputStream = new PrintWriter(file); 
     outputStream.println(instructions); 
     outputStream.flush(); 
     outputStream.close(); 
    } 
    catch(FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 

} 
} 

InvalidCharacterException

public class InvalidCharacterException extends RuntimeException 
{ 
private char c; 

public InvalidCharacterException(char c) 
{ 
    this.c=c; 
} 

public char getCharacter() 
{ 
    return c; 
} 
} 

класс Node

public class Node 
{ 
private char value; 
private String register; 
private Node left; 
private Node right; 

public Node(char value) 
{ 
    this.value=value; 
    left=null; 
    right=null; 
    register=null; 
} 
public Node(char value, String register) 
{ 
    this.value = value; 
    this.register = register; 
    left = null; 
    right = null; 
} 
public char getValue() { 
    return value; 
} 

public void setValue(char value) { 
    this.value = value; 
} 

public String getRegister() { 
    return register; 
} 

public void setRegister(String register) { 
    this.register = register; 
} 

public Node getLeft() { 
    return left; 
} 

public void setLeft(Node left) { 
    this.left = left; 
} 

public Node getRight() { 
    return right; 
} 

public void setRight(Node right) { 
    this.right = right; 
} 

public String getRegisterOrValue() 
{ 
    if (register == null) 
    { 
     return "" + value; // must convert to string 
    } 
    else 
    { 
     return register; 
    } 
} 



public String toStringHelper(int indents) { 
    String str = ""; 

    str += "value: " + value + "\n"; 

    for (int i = 0; i < indents; i++) { 
     str += "\t"; 
    } 
    if (left == null) 
     str += "LEFT: null\n"; 
    else 
     str += "LEFT: " + left.toStringHelper(indents + 1) + "\n"; 

    for (int i = 0; i < indents; i++) { 
     str += "\t"; 
    } 
    if (right == null) 
     str += "RIGHT: null\n"; 
    else 
     str += "RIGHT: " + right.toStringHelper(indents + 1) + "\n"; 

    return str; 
} 



} 
+0

Почему вы не используете Exeception, чтобы поймать его в качестве крайней меры или вам явно нужно использовать те, о которых вы упомянули? –

+0

Назначение говорит, что я должен бросить RuntimeException в основном классе, который определяет GUI, который я считаю – WILLO567

+0

Пробовал ли отладчик? –

ответ

0

Ваш метод isInteger всегда возвращает истину. Таким образом, вы никогда не обнаруживаете никаких недопустимых символов и, следовательно, никогда не бросаете свое исключение.

Как это может быть? Для большинства недопустимых символов Character.getNumericValue(c) вернет -1. Вы конвертируете это число в экземпляр Integer, а затем проверяете, является ли оно Integer. Это. Он даже объявлен целым числом, поэтому тест никогда не может потерпеть неудачу. Таким образом, ваш метод возвращает true. Назад в вашем методе buildTree, условие if будет ложным, а ваш throw заявление не достигнут.

Непосредственная мысль об исправлении будет в методе isInteger для возврата false, если вы получите отрицательный результат от Character.getNumericValue(c). Вы можете прочитать документацию этого метода еще раз, прежде чем принимать окончательное решение.

+1

Я вижу, что вы говорите, но символы a-z и A-Z имеют числовые значения, поэтому они не будут возвращаться как -1 – WILLO567

+0

True. Может быть, вам лучше использовать 'Character.isDigit()' вместо этого? @ WILLO567 –

+0

Я просто пробовал использовать Character.isDigit(), и он все еще не ловит никаких букв и бросает исключение. Он делает это, когда есть оператор, но только если оператор приводит выражение. Для справки, следующий оператор else if: else if (! IsOperator (postFix [i]) &&! IsInteger (postFix [i]) – WILLO567

 Смежные вопросы

  • Нет связанных вопросов^_^