Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理构造函数中抛出的致命异常_Java_Exception - Fatal编程技术网

Java 处理构造函数中抛出的致命异常

Java 处理构造函数中抛出的致命异常,java,exception,Java,Exception,假设我有一个类需要在其构造函数中进行一些初始化工作。没有理由相信它会失败,但是如果是这样的话,这个实例(也可能是应用程序,让我们把它看作是两个单独的案例)将被留在一个不可用的状态中,在那个范围内(实例或全局)没有真正的恢复希望。 在Java中处理这种情况的推荐方法是什么?重新抛出封装在运行时异常中的异常似乎是一种自然的方法,但对于使用哪种异常类型来实现此目的,是否有任何建议或共识?这取决于出错的原因。我的意思是,若它因为空值而失败,那个么NullPointerexception,若你们遇到了意想

假设我有一个类需要在其构造函数中进行一些初始化工作。没有理由相信它会失败,但是如果是这样的话,这个实例(也可能是应用程序,让我们把它看作是两个单独的案例)将被留在一个不可用的状态中,在那个范围内(实例或全局)没有真正的恢复希望。
在Java中处理这种情况的推荐方法是什么?重新抛出封装在运行时异常中的异常似乎是一种自然的方法,但对于使用哪种异常类型来实现此目的,是否有任何建议或共识?

这取决于出错的原因。我的意思是,若它因为空值而失败,那个么NullPointerexception,若你们遇到了意想不到的状态,那个么可能是非法状态Exception

但我建议不要公开构造函数,而是使用一个静态工厂方法,您可以命名并优雅地处理此类场景。 e、 g


我刚刚给出了一个init的例子,但你也可以有其他的选择,重点是如果构造函数处理复杂的逻辑,你可以用静态方法来处理这些东西,而不是构造函数。

这取决于出错的地方。我的意思是,若它因为空值而失败,那个么NullPointerexception,若你们遇到了意想不到的状态,那个么可能是非法状态Exception

但我建议不要公开构造函数,而是使用一个静态工厂方法,您可以命名并优雅地处理此类场景。 e、 g


我刚刚给出了一个
init
的例子,但是你也可以有其他的选择,重点是如果构造函数处理复杂的逻辑,你可以使用静态方法来处理这些东西,而不是构造函数。

如果整个应用程序处于不稳定状态,我建议直接退出应用程序,以避免更多的问题。只需在
系统上输出一些内容。err
之前

如果只有实例处于不稳定状态,您可以抛出运行时异常,但我认为这是一种危险的方式,因为他们没有义务捕获异常,这可能会导致以后出现一些问题


我建议简单地重新显示异常,或者用其他相关信息将其包装在另一个异常中。异常的确切类型在很大程度上取决于情况(空指针、非法状态、io错误等)

如果整个应用程序处于不稳定状态,我建议直接退出应用程序以避免更多问题。只需在
系统上输出一些内容。err
之前

如果只有实例处于不稳定状态,您可以抛出运行时异常,但我认为这是一种危险的方式,因为他们没有义务捕获异常,这可能会导致以后出现一些问题


我建议简单地重新显示异常,或者用其他相关信息将其包装在另一个异常中。异常的确切类型在很大程度上取决于具体情况(空指针、非法状态、io错误等)

如果构造函数中的某个内容引发异常,您可以将其声明为自身引发异常,也可以使用更一般的异常(如自己的实例化EXXXXException)将其包装起来

通常,您有多种不同含义的
可丢弃的

我将它们分类如下:

  • 异常(选中):当状态可恢复或需要额外处理时引发
  • RuntimeException(unchecked):发生意外异常(如NPE)时抛出,应用程序可能仍处于稳定状态,这取决于处理和情况。一些框架(如EJB)将每个异常包装到RuntimeException(或更常见的子类)中,以形成一个“更干净”的接口。
  • Error(unchecked):这通常是在发生一些非常糟糕的事情时抛出的,这些事情会破坏应用程序甚至JVM的稳定性(比如OutOfMemoryError)。在这种情况下,应用程序通常会退出,尽管您可能希望捕获它们并在可能的情况下进行一些特殊处理(如编写日志等)。

如果构造函数中的某个内容引发异常,您可以声明该异常以引发异常本身,也可以使用更一般的异常(如自己的实例化EXXXXException)将其包装起来

通常,您有多种不同含义的
可丢弃的

我将它们分类如下:

  • 异常(选中):当状态可恢复或需要额外处理时引发
  • RuntimeException(unchecked):发生意外异常(如NPE)时抛出,应用程序可能仍处于稳定状态,这取决于处理和情况。一些框架(如EJB)将每个异常包装到RuntimeException(或更常见的子类)中,以形成一个“更干净”的接口。
  • Error(unchecked):这通常是在发生一些非常糟糕的事情时抛出的,这些事情会破坏应用程序甚至JVM的稳定性(比如OutOfMemoryError)。在这种情况下,应用程序通常会退出,尽管您可能希望捕获它们并在可能的情况下进行一些特殊处理(如编写日志等)。

如果在对象的构造函数中抛出异常,这与在方法调用中查找异常没有太大区别,只是可以保证对象没有被构造

NewObject obj = null;
try {
   obj = new NewObject() {
} catch (Throwable t) {
   // obj is null.
}
您能否从这样的异常中恢复在很大程度上取决于抛出的异常。预计会出现检查异常,但很少出现错误;通常,它们是最容易恢复的。未经检查的异常处理像被零除这样的事情(必须捕获每一个可能的抛出将是很麻烦的)。错误是指由于对正常JVM操作不起作用的标准假设而导致程序可能失败的情况(如
NewObject obj = null;
try {
   obj = new NewObject() {
} catch (Throwable t) {
   // obj is null.
}
Runtime runtime = Runtime.getRuntime();
while (true) {
  Cache myCache = new SomeCache();
  try {
    Message message = messages.getMessage();
    if (!(cache.hasKey(message))) {
      Result result = messageProcessor.getResult(message);
      cache.put(message, result);
    }
    message.getReplyChannel().send(cache.get(message));
  } catch (OutOfMemoryException e) {
    myCache.clear();
    runtime.gc();
    messages.putBack(message);
  }
}