如何抛出 RuntimeException(“找不到符号”)

Posted

技术标签:

【中文标题】如何抛出 RuntimeException(“找不到符号”)【英文标题】:How to throw RuntimeException ("cannot find symbol") 【发布时间】:2011-03-25 06:55:25 【问题描述】:

我试图在我的代码中抛出一个异常,如下所示:

throw RuntimeException(msg);

但是当我在 NetBeans 中构建时,我得到了这个错误:

C:\....java:50: cannot find symbol
symbol  : method RuntimeException(java.lang.String)
location: class ...
        throw RuntimeException(msg);
1 error

我需要导入一些东西吗?我拼错了吗?我确定我一定是在做一些愚蠢的事情:-(

【问题讨论】:

为什么要抛出 RuntimeException? @JonathonFaust - 因为有时您既不想自己处理异常,也不想强迫用户处理异常。但是如果没有人处理它,应用程序应该会崩溃。在 Python 中,几乎每个异常都是运行时异常,并且每个人都喜欢它。如果你知道应该如何处理异常,你就处理它,如果你不知道,那么你就忽略它——要么你上面的人可以处理它,要么你会崩溃,这两种情况都很好。唯一不好的是记录它,否则忽略它。 不要抛出运行时异常或创建 RuntimeException 的子类,因为您不想为指定方法可以抛出的异常而烦恼。 journals.ecs.soton.ac.uk/java/tutorial/java/exceptions/… 需要在 throw 后加上“new”关键字。 【参考方案1】:

throw new RuntimeException(msg);

你需要new。它是创建一个实例并抛出它,而不是调用一个方法。

【讨论】:

@PedroD 因为检查的异常是失败的实验?或者你在问为什么有人要抛出一个 raw RuntimeException 而不是一个合理的子类? 不不,检查的异常应该是您可以使用的唯一类型的 throwable。它们是您正在创建/定义的 API 的一部分。未经检查的异常应保留给无法/不应恢复的系统错误(如 NullPointer 或 OutOfMemory)。例如。如果我有一个从字符串中解析数字的函数,它应该抛出一个 checked NumberFormatException,因为预计这个函数可能会因为这个原因而失败,我可能会捕捉到并且是完全合理的从那个错误中恢复,所以应该检查它......但是如果我得到一个空指针...... ...我很可能是一个编程错误(一些未处理的故障情况),所以应用程序应该终止该异常,这是故意未选中。未经检查的异常预计会在程序中的任何地方发生,并且只有在我们真的知道该恢复的含义时才应该恢复,因此为什么我们必须用 try-catch 显式包围 then 并且编译器无法判断它们被抛出的位置. 您还需要使用运行时异常,以防您有一个静态 块,您正在执行实例化并希望在实例化失败时抛出异常。由于静态块没有 throw/throws 关键字,因此 RuntimeExceptions 在这种情况下变得合适。【参考方案2】:

Exception 与 Java 中的任何其他 Object 一样。您需要使用new 关键字创建一个新的Exception,然后才能throw

throw new RuntimeException();

您还可以选择执行以下操作:

RuntimeException e = new RuntimeException();
throw e;

两个代码 sn-ps 是等价的。

Link to the tutorials for completeness.

【讨论】:

【参考方案3】:

正如其他人所说,在抛出之前实例化对象。

只是想加一点;抛出 RuntimeException 是非常罕见的。 API 中的代码抛出 this 的子类是正常的,但通常情况下,应用程序代码会抛出 Exception,或者扩展 Exception 而不是 RuntimeException 的东西。

回想起来,我错过了添加为什么您使用 Exception 而不是 RuntimeException 的原因; @Jay,在下面的评论中,添加了有用的部分。 RuntimeException 不是检查异常;

方法签名不必声明可能会引发 RuntimeException。 该方法的调用者不需要捕获异常或以任何方式确认异常。 以后尝试使用您的代码的开发人员除非仔细查看,否则不会预料到这个问题,并且会增加代码的维护负担。

【讨论】:

同上。通常,您应该创建自己的异常来抛出,并从 Exception 继承它们。 RuntimeException 应该非常小心地使用,因为它绕过了 Java 中的正常保证,即函数必须声明它可以抛出的所有异常。 这样做的一个常见情况是,如果您正在实现一个未声明任何已检查异常的现有接口。例如,编写一个网络支持的缓存,实现Map 是有意义的——但是如果在处理put()get() 时得到IOException,你将不得不抛出某种RuntimeException。 (它应该是它的一个自定义类,但它必须是一个未经检查的异常)。【参考方案4】:

你必须在扔之前实例化它

throw new RuntimeException(arg0) 

PS: 有趣的是,Netbeans IDE 应该已经指出编译时错误

【讨论】:

【参考方案5】:
throw new RuntimeException(msg); // notice the "new" keyword

【讨论】:

【参考方案6】:

您需要使用 new 创建 RuntimeException 的实例,就像创建大多数其他类的实例一样:

throw new RuntimeException(msg);

【讨论】:

【参考方案7】:

仅针对其他人:确保它是新的 RuntimeException,而不是需要错误作为参数的新 RuntimeErrorException。

【讨论】:

【参考方案8】:
throw new RuntimeException(msg);

与任何其他异常不同,我认为 RuntimeException 是唯一不会停止程序但它仍然可以继续运行和恢复的异常,只是打印出一堆异常行?如果我错了,请纠正我。

【讨论】:

【参考方案9】:

使用 new 关键字我们总是创建一个实例(新对象)并抛出它,而不是称为方法

throw new RuntimeException("Your Message");

You need the new in there. It's creating an instance and throwing it, not calling a method.

int no= new Scanner().nextInt();   // we crate an instance using new keyword and throwing it 

使用新的关键字 memory clean [因为 use and throw]

new Handler().postDelayed(new Runnable() 
    @Override
    public void run() 

        //do your work here..
    
, 1000);

【讨论】:

以上是关于如何抛出 RuntimeException(“找不到符号”)的主要内容,如果未能解决你的问题,请参考以下文章

XPATH 抛出 java.lang.RuntimeException

刷新时 CognitoCredentialsProvider 抛出 runtimeException

不推荐使用的 FacebookSdk 方法抛出 RuntimeException

spring测试事务回滚,抛出RuntimeException

如果任务抛出 RuntimeException/Error,ScheduledExecutorService.scheduleAt* 方法是不是应该重新安排任务?

使用 Optional.orElseThrow 在 Stream 中抛出 RuntimeException