不能抛出RuntimeException类型的异常

不能抛出RuntimeException类型的异常

public class RuntimeException {

private static void throwit() throws Exception
{
System.out.print("throwit ");
//throw new Exception();
throw new RuntimeException(); /* eclipse中提示这句代码有误,给出的错误提示是“No exception of    type RuntimeException can be thrown; an exception type must be a subclass of Throwable” */
}

public static void main(String[] args) {

try
{
System.out.print("try ");
throwit();
}
catch(Exception e)
{
System.out.print("catch ");
}
finally
{
System.out.print("finally ");
}
System.out.println("last");
}
}

上述程序中,代码 throw new RuntimeException(); 在 eclipse中提示这句代码有误,给出的错误提示是“No exception of    type RuntimeException can be thrown; an exception type must be a subclass of Throwable” 
网上查看到可以抛出RuntimeException类型的异常,到我这怎么就出错了,求高手解答,谢谢!


 

从 FingBugs的错误来看JAVA代码质量(五)

 

优快云 优快云推荐

Spring 事物抛出Exception 异常时事物没有回滚

java重写方法后抛出的异常及常见RuntimeException

javaSE 异常,运行时异常,RuntimeException (必须停止代码执行,提醒程序员修改代码)

Java中异常的抛出问题

dubbo 异常处理以及自定义异常

huntorhuntor10-16 13:46

等级 Bbs91楼

方法声明中throws出的是checked exception。

RuntimeException及其子类是non-checked exception。

 private static void throwit() throws Exception
=>
 private static void throwit()
去掉这个

面试题4———请写出5种常见到的runtime exception

1

ticmyticmy10-16 13:59

等级 Bbs82楼

LZ啊,你自己的类名就叫RuntimeException,你这个类又不是Throwable的子类,怎么作为异常抛出

你要不肯改名,就试试这样:
new java.lang.RuntimeException()

运行时异常(不需要捕捉)与一般异常有何异同(需要捕捉)

1

shaxiaoziloveshaxiaozilove10-16 20:26

等级 Bbs13楼

 

引用 2 楼  的回复:

LZ啊,你自己的类名就叫RuntimeException,你这个类又不是Throwable的子类,怎么作为异常抛出

你要不肯改名,就试试这样:
new java.lang.RuntimeException()


问题确实出在这里,没注意到这个问题,谢谢。

 

子类不能抛出新的异常

0

shaxiaoziloveshaxiaozilove10-16 20:27

等级 Bbs14楼

 

引用 1 楼  的回复:

方法声明中throws出的是checked exception。

RuntimeException及其子类是non-checked exception。

 private static void throwit() throws Exception
=>
 private static void throwit()
去掉这个


我试过了,这个去不去掉都没影响的,谢谢。

<think>好的,我需要帮用户解决如何判断Java中RuntimeException的具体异常类型的问题。首先,用户想知道如何获取具体的异常类型,可能需要捕获异常后进行检查。 根据引用[3]中的示例,使用try-catch块捕获异常,然后在catch块中处理。这里用户提到的是RuntimeException,而RuntimeException有很多子类,比如NullPointerException、ArrayIndexOutOfBoundsException等。用户需要区分这些具体的子类类型。 我应该建议用户使用instanceof运算符来判断异常的具体类型。例如,在catch块中捕获RuntimeException后,检查它是否是某个具体的子类。例如: catch (RuntimeException e) { if (e instanceof NullPointerException) { // 处理空指针异常 } else if (e instanceof ArrayIndexOutOfBoundsException) { // 处理数组越界 } } 另外,用户可能需要获取异常的具体信息,比如异常名称、消息或堆栈跟踪。引用[4]提到可以通过异常对象获取方法名称和参数,但实际中可能需要通过e.getClass().getName()来获取异常类的名称,或者使用e.getMessage()获取消息。 然后,需要考虑多个异常类型的处理顺序,因为有些异常可能属于多个类别,但instanceof会按顺序检查,所以应该先处理更具体的异常类型,再处理较一般的。 另外,引用[3]中的代码示例展示了如何捕获ArrayIndexOutOfBoundsException,这说明用户可能需要针对不同异常类型进行不同的处理。因此,建议用户明确异常类型,并使用多个catch块分别处理不同的异常,或者在单个catch块中使用条件判断。 总结步骤应该是:捕获RuntimeException,然后检查其具体类型,使用instanceof判断,并根据类型进行相应处理。同时,可以获取异常的具体信息,如类名、消息等。 可能需要提醒用户注意异常处理的顺序,以及合理使用异常处理机制来增强程序的健壮性,如引用[3]所提到的。另外,引用[2]列出了具体的RuntimeException子类,用户需要根据这些类型进行检查。 最后,用户可能需要代码示例来更好地理解,因此提供一个具体的例子会更好,比如捕获RuntimeException后打印具体类型名称,或者根据类型执行不同的逻辑。</think>### Java RuntimeException 获取具体异常类型的方法 在Java中,`RuntimeException` 是运行时异常的基类,其具体子类包括 `NullPointerException`、`ArrayIndexOutOfBoundsException`、`ClassCastException` 等[^2]。要判断具体的异常类型,可以通过以下步骤实现: --- #### 方法一:使用 `instanceof` 运算符 在 `catch` 块中捕获 `RuntimeException` 后,通过 `instanceof` 判断异常的具体子类型: ```java try { // 可能抛出异常的代码 } catch (RuntimeException e) { if (e instanceof NullPointerException) { System.out.println("空指针异常:" + e.getMessage()); } else if (e instanceof ArrayIndexOutOfBoundsException) { System.out.println("数组越界异常:" + e.getMessage()); } else { System.out.println("其他运行时异常:" + e.getClass().getName()); } } ``` - **说明**:`instanceof` 可精确匹配异常类型,适用于需要针对不同异常类型执行不同逻辑的场景[^3]。 --- #### 方法二:通过 `getClass()` 获取异常类型名称 直接获取异常对象的类名: ```java try { // 可能抛出异常的代码 } catch (RuntimeException e) { String exceptionType = e.getClass().getSimpleName(); System.out.println("异常类型:" + exceptionType); System.out.println("详细信息:" + e.getMessage()); } ``` - **说明**:`getClass().getSimpleName()` 返回简化的类名(如 `NullPointerException`),`getMessage()` 获取异常信息[^4]。 --- #### 方法三:多 `catch` 块分别处理 针对不同异常类型使用独立的 `catch` 块: ```java try { // 可能抛出异常的代码 } catch (NullPointerException e) { System.out.println("空指针异常:" + e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组越界异常:" + e.getMessage()); } catch (RuntimeException e) { System.out.println("其他运行时异常:" + e.getClass().getName()); } ``` - **说明**:多个 `catch` 块需按从具体到一般的顺序排列,否则会编译报错[^2]。 --- #### 关键注意事项 1. **异常处理顺序**:若使用多 `catch` 块,子类异常需定义在父类之前。 2. **日志记录**:建议记录完整的堆栈轨迹(`e.printStackTrace()` 或日志框架),便于调试。 3. **避免空捕获**:避免空的 `catch` 块,否则会隐藏潜在问题[^3]。 --- ### 示例代码 ```java public class ExceptionDemo { public static void main(String[] args) { try { int[] numbers = {1, 2}; System.out.println(numbers[3]); // 触发ArrayIndexOutOfBoundsException } catch (RuntimeException e) { if (e instanceof ArrayIndexOutOfBoundsException) { System.out.println("捕获数组越界异常:" + e.getMessage()); } else { System.out.println("未知运行时异常:" + e.getClass().getName()); } } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值