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

47
我正在尝试像这样在我的代码中抛出一个异常:
throw RuntimeException(msg);

但是当我在NetBeans中构建时,会出现以下错误:

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

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


3
为什么要抛出RuntimeException? - Jonathon Faust
10
@JonathonFaust - 有时候,你既不想自己处理异常,也不想强制用户处理异常。但是,如果没有人处理它,应用程序就应该崩溃。在Python中,几乎每个异常都是运行时异常,人人都喜欢它。如果你知道如何处理异常,就处理它,如果不知道,那么你就忽略它 - 要么上面的某个人可以处理它,要么你会崩溃,无论哪种情况都可以接受。唯一不好的是记录它并且无视它。 - ArtOfWarfare
不要因为不想指定方法可能抛出的异常而抛出运行时异常或创建RuntimeException子类。 http://journals.ecs.soton.ac.uk/java/tutorial/java/exceptions/runtime.html - Martin Spamer
1
需要在throw后添加"new"关键字。 - Ripon Al Wasim
9个回答

140

throw new RuntimeException(msg);

你需要加上new关键字,因为它是在创建一个实例并抛出异常,而不是调用一个方法。


3
因为受检异常是一个失败的实验吗?还是你在问为什么有人想要抛出一个原始的 RuntimeException 而不是一个合理的子类? - Dave Newton
不,已检查异常应该是您可以使用的唯一可抛类型。它们是您正在创建/定义的API的一部分。未经检查的异常应保留用于无法/不应恢复的系统错误(例如NullPointer或OutOfMemory)。例如,如果我有一个从字符串解析数字的函数,它应该抛出一个已检查的NumberFormatException,因为预计此函数可能因为这个原因而失败,并且完全合理我可能会捕获并从该错误中恢复,所以它应该被检查...但是如果我得到了一个空指针... - PedroD
1
很有可能是编程错误(某些未处理的故障条件),因此应用程序应该以该异常终止,这是有意未经检查的。未经检查的异常可能会在程序的任何地方发生,并且只有在我们确实知道恢复的影响时才应该进行恢复,因此我们必须明确地用try-catch包围它们,而编译器无法确定它们被抛出的位置。 - PedroD
你还需要在运行时使用异常(RuntimeExceptions),以防你有一个静态{}块,在其中进行实例化,并且如果该实例化失败,则想要抛出异常。由于静态块没有throw/throws关键字,因此在这种情况下,RuntimeExceptions变得适用。 - Ankit Arora

38

Exception是Java中像其他对象一样的一个类型。在你throw之前,需要使用new关键字创建一个新的Exception

throw new RuntimeException();

你也可以选择执行以下操作:

RuntimeException e = new RuntimeException();
throw e;

这两个代码片段是等效的。

请参考教程以获得更完整的信息。


16

正如其他人所说,先实例化对象再抛出它。

只想补充一点; 抛出RuntimeException非常不常见。 API中的代码可以抛出其子类,但通常,应用程序代码会抛出Exception或继承Exception但不是RuntimeException的异常。

回顾一下,我错过了添加为什么要使用Exception而不是RuntimeException的原因; 在下面的评论中,@Jay添加了有用的信息。 RuntimeException不是已检查的异常;

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

1
同上。一般来说,您应该创建自己的异常并将其继承自Exception。RuntimeException 应该非常小心地使用,因为它会绕过Java中的正常保证,即函数必须声明它可以抛出的所有异常。 - Jay
一个常见的情况是在实现一个不声明任何受检异常的已有接口时这样做。例如,当编写一个网络支持的缓存时,实现Map是合理的 - 但是如果在处理 put()get() 时遇到 IOException,你就必须抛出某种运行时异常 (应该是自定义的类,但它必须是未经检查的异常)。 - Andrzej Doyle

5

在抛出异常之前,您需要实例化它。

throw new RuntimeException(arg0) 

PS:有趣的是,NetBeans集成开发环境应该已经指出了编译时错误。


4
throw new RuntimeException(msg); // notice the "new" keyword

3

您需要创建RuntimeException的实例,使用new的方式与创建大多数其他类的实例相同:

throw new RuntimeException(msg);

2
使用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 

使用 new 关键字可以进行内存清理 [因为使用后即可丢弃]。
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {

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

1
throw new RuntimeException(msg);

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接