Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 - Fatal编程技术网

Java 如何正确处理多个异常抛出器对象

Java 如何正确处理多个异常抛出器对象,java,Java,我不想用这个方法处理更高级别的异常,但我想确保对象a&b正确关闭 close()方法也可以引发异常 此模板是适合此问题的解决方案还是有更智能/更简单的解决方案 public void foo() throws Exception { A a = null; B b = null; try { a = new A(); b = new B(); ... } catch(Exception e) { throw e; } finally { Exception ex

我不想用这个方法处理更高级别的异常,但我想确保对象a&b正确关闭

close()方法也可以引发异常

此模板是适合此问题的解决方案还是有更智能/更简单的解决方案

public void foo() throws Exception {
 A a = null;
 B b = null;
 try {
  a = new A();
  b = new B();
  ...
 } catch(Exception e) {
  throw e;
 }
 finally {
  Exception ex = null;
  try {
   if (a != null)
    a.close();
  } catch(Exception x){
    ex = x;
  }
  try {
   if (b != null)
    b.close();
  } catch(Exception x) {
   ex = x;
  }
  if (ex != null)
   throw ex;
 }
try
块不需要
catch
块,它需要
catch
finally
块(或两者都需要)


try
块不需要
catch
块,它需要
catch
finally
块(或两者兼有)。

此问题的正确解决方案(在C中)是
使用
语句:

using(A a = new A())
using(B b = new B())
{
    //...
}

这确保了当控件离开块时,
a
b
都是
Dispose
d。

此问题的正确解决方案(在C#)是
使用
语句:

using(A a = new A())
using(B b = new B())
{
    //...
}

这确保了当控件离开块时
a
b
都是
Dispose
d。

我只看到一个小问题:如果
a.close()
b.close()
都失败,那么
a.close()
的异常就会丢失,因为您重用了
ex


您可以使用记录器来持久化异常消息—在这种情况下,只在finally块中抛出任何异常就足够了,因为您已将错误消息保存在日志文件中

我只看到一个小问题:如果
a.close()
b.close()
都失败,那么
a.close()
的异常就会丢失,因为您重用了
ex

您可以使用记录器来持久化异常消息—在这种情况下,只在finally块中抛出任何异常就足够了,因为您已将错误消息保存在日志文件中

  • 除了Femaref所说的之外,您还可以创建一个helper方法,该方法接受一个或多个可关闭的对象,并在必要时抛出异常。只是为了减少冗余

  • 通常需要返回原始错误消息,而不是在
    close
    调用期间发生的错误消息。后者可能直接从前者开始,但您需要前者才能找到问题的真正原因

  • 除了Femaref所说的之外,您还可以创建一个helper方法,该方法接受一个或多个可关闭的对象,并在必要时抛出异常。只是为了减少冗余

  • 通常需要返回原始错误消息,而不是在
    close
    调用期间发生的错误消息。后者可能直接从前者开始,但您需要前者才能找到问题的真正原因


  • 有什么原因会同时标记[c#]和[java]吗?通过对close方法进行错误检查,您会得到什么?为什么不进一步处理它们?为什么同时标记[c#]和[java]?通过对close方法进行错误检查,您得到了什么?为什么不进一步处理呢?