Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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中toString方法的异常_Java_Exception_Tostring_Throwable - Fatal编程技术网

捕获Java中toString方法的异常

捕获Java中toString方法的异常,java,exception,tostring,throwable,Java,Exception,Tostring,Throwable,最近我在GitHub上看到了以下代码: private static String safeToString(Object obj) { if (obj == null) return null; try { return obj.toString(); } catch (Throwable t) { return "Error occured"; } } 我从未将toString()方法调用放在try-catch块中。但现在当我

最近我在GitHub上看到了以下代码:

private static String safeToString(Object obj) {
    if (obj == null) return null;
    try {
        return obj.toString();
    } catch (Throwable t) {
        return "Error occured";
    }
}

我从未将
toString()
方法调用放在
try-catch
块中。但现在当我考虑它时,它可能是有意义的。例如,有人可以覆盖其类中可能引发运行时异常的
toString()
方法,如
NullPointerException
。因此,我们可以尝试捕获异常。但是为什么要扔掉?你认为这有什么意义吗?

Throwable
异常
错误
的父类。 通常情况下,尝试捕捉
错误是个坏主意,因为它被设计为不被捕捉

捕获可丢弃的
只是捕获
异常的过度实现和适得其反的版本。尽管如此,如果出于某种原因,您创建了另一种类型的
可丢弃文件
,您希望捕获一个
异常
,那么这可能是在单个try/catch块中实现这一点的一种方法。这并不是说这是一个干净的方式,但它会起作用


为TL编辑;DR:在大多数情况下,catch
Exception
而不是
Throwable
Throwable
Exception
Error
的父类。 通常情况下,尝试捕捉
错误是个坏主意,因为它被设计为不被捕捉

捕获可丢弃的
只是捕获
异常的过度实现和适得其反的版本。尽管如此,如果出于某种原因,您创建了另一种类型的
可丢弃文件
,您希望捕获一个
异常
,那么这可能是在单个try/catch块中实现这一点的一种方法。这并不是说这是一个干净的方式,但它会起作用


为TL编辑;DR:在大多数情况下,捕获
异常
而不是
可丢弃

在很少的情况下,您可能希望捕获这样的错误。一般来说,这不是一个好主意,但是在这种情况下,这可能是有意义的,因为这通常用于日志记录/调试目的,而不是由应用程序直接使用

我更喜欢信息量更大的东西,比如

private static String safeToString(Object obj) {
    if (obj == null) return null;
    try {
        return obj.toString();
    } catch (Throwable t) {
        return obj.getClass() + ".toString() threw " + t;
    }
}
e、 g


在很少的情况下,您可能希望捕获这样的错误。一般来说,这不是一个好主意,但是在这种情况下,这可能是有意义的,因为这通常用于日志记录/调试目的,而不是由应用程序直接使用

我更喜欢信息量更大的东西,比如

private static String safeToString(Object obj) {
    if (obj == null) return null;
    try {
        return obj.toString();
    } catch (Throwable t) {
        return obj.getClass() + ".toString() threw " + t;
    }
}
e、 g


捕获任何可丢弃的
然后继续执行是不正确的,因为它包括
错误
,这意味着是致命的:

从:

Error
Throwable
的一个子类,表示合理的应用程序不应试图捕捉的严重问题。大多数此类错误都是异常情况。该错误虽然是“正常”情况,但也是
error
的一个子类,因为大多数应用程序不应该尝试捕捉它

也就是说,一些
错误
是可以恢复的(例如
LinkageError
),但其他的则不能

但是捕获异常可能是一个有效的用例,例如,在记录代码时,您不希望仅仅因为调用
toString()
失败而中断执行:

private static String safeToString(Object obj) {
    try {
        return obj == null ? "null" : obj.toString();
    } catch (Exception e) {
        return "<exception: " + e + ">";
    }
}
私有静态字符串safeToString(对象obj){
试一试{
返回obj==null?“null”:obj.toString();
}捕获(例外e){
返回“”;
}
}

捕获任何可丢弃的
然后继续执行是不正确的,因为它包含
错误
,这意味着是致命的:

从:

Error
Throwable
的一个子类,表示合理的应用程序不应试图捕捉的严重问题。大多数此类错误都是异常情况。该错误虽然是“正常”情况,但也是
error
的一个子类,因为大多数应用程序不应该尝试捕捉它

也就是说,一些
错误
是可以恢复的(例如
LinkageError
),但其他的则不能

但是捕获异常可能是一个有效的用例,例如,在记录代码时,您不希望仅仅因为调用
toString()
失败而中断执行:

private static String safeToString(Object obj) {
    try {
        return obj == null ? "null" : obj.toString();
    } catch (Exception e) {
        return "<exception: " + e + ">";
    }
}
私有静态字符串safeToString(对象obj){
试一试{
返回obj==null?“null”:obj.toString();
}捕获(例外e){
返回“”;
}
}

这样做几乎没有好的理由。声明没有说允许从该方法抛出异常。任何抛出异常的代码都是坏代码,这种异常需要公开和修复,而不是抑制

在将某个“坏”对象从您无法控制的库转换为字符串的情况下,可以编写
catch(RuntimeExcepton e)
,但这样的catch应该附带注释,详细说明为什么需要它,因为在正常情况下不需要它

撇开抛出toString方法的Rogue异常不谈,请注意Java已经有了至少两种“安全”的方法来将可能为空的值转换为字符串:

  • Objects.toString(obj,null)
  • String.valueOf(obj)

…因此,我怀疑是否应该存在safeToString方法。

这样做几乎没有好的理由。声明没有说允许从该方法抛出异常。任何抛出异常的代码都是坏代码,这种异常需要公开和修复,而不是抑制

在将某个“坏”对象从您无法控制的库转换为字符串的情况下,可能适合编写
catch(RuntimeExcepton e)
,但这样的catch应该