Java 未引发选中的异常并将其转换为RuntimeException

Java 未引发选中的异常并将其转换为RuntimeException,java,exception,Java,Exception,这里发生了什么 为什么IOException(RemoteException)的选中子级转换为RuntimeException 摘自 import java.rmi.RemoteException; 职业投掷运动员{ 公共静态无效吐出(最终可丢弃例外){ 职业投掷运动员{ @抑制警告(“未选中”) private void Skillythrow(可丢弃异常)抛出T{ 抛出(T)异常;//有趣的事情 } } new Evillthrower().Skillythrow(例外); } } 公开课投

这里发生了什么

为什么IOException(RemoteException)的选中子级转换为RuntimeException

摘自

import java.rmi.RemoteException;
职业投掷运动员{
公共静态无效吐出(最终可丢弃例外){
职业投掷运动员{
@抑制警告(“未选中”)
private void Skillythrow(可丢弃异常)抛出T{
抛出(T)异常;//有趣的事情
}
}
new Evillthrower().Skillythrow(例外);
}
}
公开课投手样本{
公共静态void main(字符串[]args){
spit(新的RemoteException(“未检查”);
}
}
这里发生了什么

此代码绕过了

为什么它会有用? 使用使用检查异常的api并不总是很方便

最著名的例子之一是。使用jdbc总是需要开发人员处理。但通常情况下,除了例外情况,你不知道该怎么办

或者如果您正在使用库,开发人员决定从
Exception
而不是
RuntimeException
继承他们的异常


为什么
IOException
RemoteException
)的选中子级被转换为
RuntimeException
? 它不会转换为
运行时异常

引发的异常是
RemoteException

Exception in thread "main" java.rmi.RemoteException: go unchecked!
代码段使用Java泛型“技巧”。如果没有
@SuppressWarnings(“unchecked”)
行,编译器将生成一个unchecked强制转换警告

难题43 代码片段是谜题43的解决方案之一:

可以编写一个功能等同于
skillythrow
不使用任何不推荐的方法。事实上,至少有两种方法可以做到这一点。 其中一个仅适用于5.0版和更高版本。你能写这样一本书吗 方法?它必须用Java编写,而不是用JVM字节码编写。你不可更改密码 方法在编译其客户端之后。你的方法不一定要完美:它是完美的 如果它不能抛出一个或两个
Exception
的子类,则可以接受

书中使用泛型的解决方案:

// Don’t do this either - circumvents exception checking!
class TigerThrower<T extends Throwable> {
    public static void sneakyThrow(Throwable t) {
        new TigerThrower<Error>().sneakyThrow2(t);
    }
    private void sneakyThrow2(Throwable t) throws T {
        throw (T) t;
    }
}
//也不要这样做-避免异常检查!
类虎钳功率{
公共静态无效行(可丢弃的t){
新虎钳();
}
私人空间鬼鬼祟祟的row2(可丢弃的t)抛出t{
投掷(T)T;
}
}
本书中关于此解决方案的注释:

警告是编译器告诉您可能是自杀的方式 在脚上,事实上你是。未选中的强制类型转换警告告诉您 在运行时不会检查有问题的强制转换。当你得到一个未经检查的 发出警告,修改程序以消除它,或者说服自己 演员不能失败

总之,Java的异常检查不是由虚拟机强制执行的 机器。它是一种编译时工具,旨在使编写正确的代码更容易 程序,但可以在运行时绕过它。为了减少接触,请不要 忽略编译器警告


另见:

这里发生了什么

此代码绕过了

为什么它会有用? 使用使用检查异常的api并不总是很方便

最著名的例子之一是。使用jdbc总是需要开发人员处理。但通常情况下,除了例外情况,你不知道该怎么办

或者如果您正在使用库,开发人员决定从
Exception
而不是
RuntimeException
继承他们的异常


为什么
IOException
RemoteException
)的选中子级被转换为
RuntimeException
? 它不会转换为
运行时异常

引发的异常是
RemoteException

Exception in thread "main" java.rmi.RemoteException: go unchecked!
代码段使用Java泛型“技巧”。如果没有
@SuppressWarnings(“unchecked”)
行,编译器将生成一个unchecked强制转换警告

难题43 代码片段是谜题43的解决方案之一:

可以编写一个功能等同于
skillythrow
不使用任何不推荐的方法。事实上,至少有两种方法可以做到这一点。 其中一个仅适用于5.0版和更高版本。你能写这样一本书吗 方法?它必须用Java编写,而不是用JVM字节码编写。你不可更改密码 方法在编译其客户端之后。你的方法不一定要完美:它是完美的 如果它不能抛出一个或两个
Exception
的子类,则可以接受

书中使用泛型的解决方案:

// Don’t do this either - circumvents exception checking!
class TigerThrower<T extends Throwable> {
    public static void sneakyThrow(Throwable t) {
        new TigerThrower<Error>().sneakyThrow2(t);
    }
    private void sneakyThrow2(Throwable t) throws T {
        throw (T) t;
    }
}
//也不要这样做-避免异常检查!
类虎钳功率{
公共静态无效行(可丢弃的t){
新虎钳();
}
私人空间鬼鬼祟祟的row2(可丢弃的t)抛出t{
投掷(T)T;
}
}
本书中关于此解决方案的注释:

警告是编译器告诉您可能是自杀的方式 在脚上,事实上你是。未选中的强制类型转换警告告诉您 在运行时不会检查有问题的强制转换。当你得到一个未经检查的 发出警告,修改程序以消除它,或者说服自己 演员不能失败

总之,Java的异常检查不是由虚拟机强制执行的 机器。它是一种编译时工具,旨在使编写正确的代码更容易 程序,但可以在运行时绕过它。为了减少接触,请不要 忽略编译器警告


另见:
因为
运行时异常
?它不会转换为运行时异常。编译器只是被u欺骗了