- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个初学者的java应用程序,它将中缀表达式转换为后缀,然后对其求值。我花了很多时间尝试修复以下错误消息:
Interface.java:21: error: unreported exception SyntaxErrorException; must be caught or declared to be thrown
String conversion = infix.convert(str);
^
Interface.java:22: error: unreported exception SyntaxErrorException; must be caught or declared to be thrown
System.out.println(postfix.eval(conversion));
^
2 errors
您能帮我解决这些错误吗?我一直在搞乱 try/catch 语句并移动 SyntaxErrorException 类,但我还没有任何运气。这是我到目前为止的程序:
接口(interface).java
import java.util.*;
/**
* Interface:
*/
class Interface {
/**
*
*/
public static void main( String [ ] args )
{
String str = "";
Scanner keyboard = new Scanner (System.in);
InfixToPostfix infix = new InfixToPostfix();
PostfixEvaluator postfix = new PostfixEvaluator();
System.out.println( "Enter expressions, one per line:" );
while( ( str = keyboard.next() ) != null )
{
System.out.println( "Read: " + str );
String conversion = infix.convert(str);
System.out.println(postfix.eval(conversion));
System.out.println( "Enter next expression:" );
}
}
}
InfixToPostfix.java
import java.util.*;
/**
* Translates an infix expression to a postfix expression.
*/
public class InfixToPostfix {
// Nested Class
/** Class to report a syntax error. */
public static class SyntaxErrorException
extends Exception {
/** Construct a SyntaxErrorException with the specified
message.
@param message The message
*/
SyntaxErrorException(String message) {
super(message);
}
}
// Data Fields
/** The operator stack */
private Stack < Character > operatorStack;
/** The operators */
private static final String OPERATORS = "+-*/";
/** The precedence of the operators, matches order in OPERATORS. */
private static final int[] PRECEDENCE = {
1, 1, 2, 2};
/** The postfix string */
private StringBuilder postfix;
/** Convert a string from infix to postfix.
@param infix The infix expression
@throws SyntaxErrorException
*/
public String convert(String infix) throws SyntaxErrorException {
operatorStack = new Stack < Character > ();
postfix = new StringBuilder();
StringTokenizer infixTokens = new StringTokenizer(infix);
try {
// Process each token in the infix string.
while (infixTokens.hasMoreTokens()) {
String nextToken = infixTokens.nextToken();
char firstChar = nextToken.charAt(0);
// Is it an operand?
if (Character.isJavaIdentifierStart(firstChar)
|| Character.isDigit(firstChar)) {
postfix.append(nextToken);
postfix.append(' ');
} // Is it an operator?
else if (isOperator(firstChar)) {
processOperator(firstChar);
}
else {
throw new SyntaxErrorException
("Unexpected Character Encountered: "
+ firstChar);
}
} // End while.
// Pop any remaining operators and
// append them to postfix.
while (!operatorStack.empty()) {
char op = operatorStack.pop();
postfix.append(op);
postfix.append(' ');
}
// assert: Stack is empty, return result.
return postfix.toString();
}
catch (EmptyStackException ex) {
throw new SyntaxErrorException
("Syntax Error: The stack is empty");
}
}
/** Method to process operators.
@param op The operator
@throws EmptyStackException
*/
private void processOperator(char op) {
if (operatorStack.empty()) {
operatorStack.push(op);
}
else {
// Peek the operator stack and
// let topOp be top operator.
char topOp = operatorStack.peek();
if (precedence(op) > precedence(topOp)) {
operatorStack.push(op);
}
else {
// Pop all stacked operators with equal
// or higher precedence than op.
while (!operatorStack.empty()
&& precedence(op) <= precedence(topOp)) {
operatorStack.pop();
postfix.append(topOp);
postfix.append(' ');
if (!operatorStack.empty()) {
// Reset topOp.
topOp = operatorStack.peek();
}
}
// assert: Operator stack is empty or
// current operator precedence >
// top of stack operator precedence.
operatorStack.push(op);
}
}
}
/** Determine whether a character is an operator.
@param ch The character to be tested
@return true if ch is an operator
*/
private boolean isOperator(char ch) {
return OPERATORS.indexOf(ch) != -1;
}
/** Determine the precedence of an operator.
@param op The operator
@return the precedence
*/
private int precedence(char op) {
return PRECEDENCE[OPERATORS.indexOf(op)];
}
}
PostfixEvaluator.java
import java.util.*;
/**
* Class that can evaluate a postfix expression.
* */
public class PostfixEvaluator {
// Nested Class
/** Class to report a syntax error. */
public static class SyntaxErrorException
extends Exception {
/** Construct a SyntaxErrorException with the specified
message.
@param message The message
*/
SyntaxErrorException(String message) {
super(message);
}
}
// Constant
/** A list of operators. */
private static final String OPERATORS = "+-*/";
// Data Field
/** The operand stack. */
private Stack < Integer > operandStack;
// Methods
/** Evaluates the current operation.
This function pops the two operands off the operand
stack and applies the operator.
@param op A character representing the operator
@return The result of applying the operator
@throws EmptyStackException if pop is attempted on
an empty stack
*/
private int evalOp(char op) {
// Pop the two operands off the stack.
int rhs = operandStack.pop();
int lhs = operandStack.pop();
int result = 0;
// Evaluate the operator.
switch (op) {
case '+':
result = lhs + rhs;
break;
case '-':
result = lhs - rhs;
break;
case '/':
result = lhs / rhs;
break;
case '*':
result = lhs * rhs;
break;
}
return result;
}
/** Determines whether a character is an operator.
@param op The character to be tested
@return true if the character is an operator
*/
private boolean isOperator(char ch) {
return OPERATORS.indexOf(ch) != -1;
}
/** Evaluates a postfix expression.
@param expression The expression to be evaluated
@return The value of the expression
@throws SyntaxErrorException if a syntax error is detected
*/
public int eval(String expression) throws SyntaxErrorException {
// Create an empty stack.
operandStack = new Stack < Integer > ();
// Process each token.
StringTokenizer tokens = new StringTokenizer(expression);
try {
while (tokens.hasMoreTokens()) {
String nextToken = tokens.nextToken();
// Does it start with a digit?
if (Character.isDigit(nextToken.charAt(0))) {
// Get the integer value.
int value = Integer.parseInt(nextToken);
// Push value onto operand stack.
operandStack.push(value);
} // Is it an operator?
else if (isOperator(nextToken.charAt(0))) {
// Evaluate the operator.
int result = evalOp(nextToken.charAt(0));
// Push result onto the operand stack.
operandStack.push(result);
}
else {
// Invalid character.
throw new SyntaxErrorException(
"Invalid character encountered");
}
} // End while.
// No more tokens - pop result from operand stack.
int answer = operandStack.pop();
// Operand stack should be empty.
if (operandStack.empty()) {
return answer;
}
else {
// Indicate syntax error.
throw new SyntaxErrorException(
"Syntax Error: Stack should be empty");
}
}
catch (EmptyStackException ex) {
// Pop was attempted on an empty stack.
throw new SyntaxErrorException(
"Syntax Error: The stack is empty");
}
}
}
预先感谢您提供任何有用的提示或解决方案。
最佳答案
错误告诉您有一个 checked exception that you haven't handled 。 “已检查”意味着编译器强制您对其执行某些操作,并且您不能忽略它。您要么必须使用 try/catch block 捕获它,要么声明发生问题的方法抛出此异常。在这种情况下,您的主要方法是调用convert() 和eval(),这两个方法都会抛出SyntaxErrorException。这意味着您需要在 main 中围绕 Convert() 和 eval() 进行 try/catch,否则 main 必须声明抛出 SyntaxErrorException
。
编辑:啊,我看得不够仔细。您的问题是您有两个不同的 SyntaxErrorException,尽管错误消息只提供了简单的类名,因此很难区分。您真的需要两个不同的异常(exception)吗?它们具有相同的名称这一事实意味着并非如此。无论如何,在您目前的情况下,您只需要确保处理两个异常即可。要么
public static void main(String[] args) throws InfixToPostfix.SyntaxErrorException, PostfixEvaluator.SyntaxErrorException {
或
try {
String conversion = infix.convert(str);
System.out.println(postfix.eval(conversion));
} catch (InfixToPostfix.SyntaxErrorException e) {
...
} catch (PostfixEvaluator.SyntaxErrorException e) {
...
}
关于java - 接口(interface)类调用未报告的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7700649/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!