Java 当我创建一个新的异常时,我必须抛出它,还是可以将它放在列表中?

Java 当我创建一个新的异常时,我必须抛出它,还是可以将它放在列表中?,java,exception-handling,Java,Exception Handling,我有一个项目,我必须解析格式化的ASCII数据。解析器可能会在格式化出现问题时(预期未找到,意外发现数据)进行识别。通常,如果我发现某件事情失败,我会抛出一个异常。不过,这次我想继续解析过程,并将解析器错误存储在结束类中。我的问题是,创建一个新的异常并将其存储在一个列表中,而不是抛出它,这样就不会停止处理,这样可以吗?如果您不想中止处理(即,您可以在本地处理问题),您不应该使用异常。创建一个异常但不抛出它不是一个很好的主意(它相当昂贵,而且不是“主流”,因此它使您的代码更难理解和使用) 最好只创

我有一个项目,我必须解析格式化的ASCII数据。解析器可能会在格式化出现问题时(预期未找到,意外发现数据)进行识别。通常,如果我发现某件事情失败,我会抛出一个异常。不过,这次我想继续解析过程,并将解析器错误存储在结束类中。我的问题是,创建一个新的异常并将其存储在一个列表中,而不是抛出它,这样就不会停止处理,这样可以吗?

如果您不想中止处理(即,您可以在本地处理问题),您不应该使用异常。创建一个异常但不抛出它不是一个很好的主意(它相当昂贵,而且不是“主流”,因此它使您的代码更难理解和使用)


最好只创建一个错误消息字符串,并将其存储在问题列表中。或者,如果您需要存储更多结构化错误信息,请为其创建自定义类。

如果您不想中止处理(即您可以在本地处理问题),则不应使用异常。创建一个异常但不抛出它不是一个很好的主意(它相当昂贵,而且不是“主流”,因此它使您的代码更难理解和使用)

最好只创建一个错误消息字符串,并将其存储在问题列表中。或者,如果需要存储更多结构化错误信息,请为其创建自定义类

我的问题是,创建一个新的异常并将其存储在一个列表中,而不是抛出它,这样就不会停止处理,这样可以吗

对。那就行了。但是这相当昂贵,因为异常对象捕获了当前线程的所有堆栈帧。如果您不打算使用堆栈帧,也不打算抛出异常,那么您已经做了很多不必要的工作。除非有特定的原因必须使用
异常
,否则最好使用一个简单的类来捕获错误详细信息

然而,有一个聪明的技巧可以用来降低异常对象实例化的成本。如果查看
Throwable
API,您会注意到有一个名为
fillInStackTrace()
的方法。该方法由
Throwable
构造函数本身调用以捕获堆栈帧,而实现(在
Throwable
中)在一些本机代码中实现了这一点。但是,此方法不是final,因此您可以在自定义异常类中重写它,将其转换为no-op

瞧!一个运行速度更快的构造函数!!但是,当然,如果您需要异常的堆栈跟踪,那么您就不走运了。所以我建议尽量少用这种技巧

我的问题是,创建一个新的异常并将其存储在一个列表中,而不是抛出它,这样就不会停止处理,这样可以吗

对。那就行了。但是这相当昂贵,因为异常对象捕获了当前线程的所有堆栈帧。如果您不打算使用堆栈帧,也不打算抛出异常,那么您已经做了很多不必要的工作。除非有特定的原因必须使用
异常
,否则最好使用一个简单的类来捕获错误详细信息

然而,有一个聪明的技巧可以用来降低异常对象实例化的成本。如果查看
Throwable
API,您会注意到有一个名为
fillInStackTrace()
的方法。该方法由
Throwable
构造函数本身调用以捕获堆栈帧,而实现(在
Throwable
中)在一些本机代码中实现了这一点。但是,此方法不是final,因此您可以在自定义异常类中重写它,将其转换为no-op


瞧!一个运行速度更快的构造函数!!但是,当然,如果您需要异常的堆栈跟踪,那么您就不走运了。因此,我建议您尽量少用这种技巧。

您可以执行以下操作:

  • 存储问题列表(例如,字符串消息列表或包含问题详细信息的特定对象列表)
  • 最后,如果列表不是空的,抛出一个包含该列表的自定义异常
例如:

List<ParsingProblem> problems = new ArrayList<ParsingProblem>();
while (parsing) {
  ...
  problems.add(new ParsingProblem("some message", someRelevantValue));
}

if (!problems.isEmpty()) {
   throw new ParsingException(problems);
}
List problems=new ArrayList();
while(解析){
...
添加(新的ParsingProblem(“一些消息”,一些相关值));
}
如果(!problems.isEmpty()){
抛出新的ParsingException(问题);
}

您可以执行以下操作:

  • 存储问题列表(例如,字符串消息列表或包含问题详细信息的特定对象列表)
  • 最后,如果列表不是空的,抛出一个包含该列表的自定义异常
例如:

List<ParsingProblem> problems = new ArrayList<ParsingProblem>();
while (parsing) {
  ...
  problems.add(new ParsingProblem("some message", someRelevantValue));
}

if (!problems.isEmpty()) {
   throw new ParsingException(problems);
}
List problems=new ArrayList();
while(解析){
...
添加(新的ParsingProblem(“一些消息”,一些相关值));
}
如果(!problems.isEmpty()){
抛出新的ParsingException(问题);
}

语言或JVM规范中没有任何东西强迫您抛出
异常
,您可以像处理Java中任何其他
对象一样处理它。是的,从这个角度来看,保存一个
Exception
对象的列表是非常好的

然而,这是一件相当不寻常的事情。就其本身而言,我不会说它是一个糟糕的设计,但它有点奇怪的味道


也许您可以通过创建一个
问题
并将其保存在
列表中(并在自定义
异常
中添加这样一个对象)来避免这个问题。

语言或JVM规范中没有强制您抛出一个
异常
,您可以像在Java中处理任何其他
对象那样处理它。所以是的,从这个