我注意到Integer.parseInt()你不必用try catch包围它,或者声明该方法可能抛出一个异常,尽管它"抛出"了一个NumberFormatException.
为什么我不必明确地捕获NumberFormatException或声明我的方法抛出它?
我在RuntimeException上听到了很多关于异常的事情,但没有给出明确的参数.我也看到很多关于Stack Overflow的主题,但似乎没有人直接提出这个问题(如果是这种情况,感谢关闭它作为重复并显示链接!)
我想明确知道何时使用RuntimeException以及何时使用经典Exception.
对于业务逻辑(即异常可能是用户错误(错误数据)),您是使用异常还是运行时?
当您创建自己的异常(在业务逻辑中)时,您是否有2或3个建议您选择抛出异常或运行时异常?
class Y {
public static void main(String[] args) throws RuntimeException{//Line 1
try {
doSomething();
}
catch (RuntimeException e) {
System.out.println(e);
}
}
static void doSomething() throws RuntimeException{ //Line 2
if (Math.random() > 0.5) throw new RuntimeException(); //Line 3
throw new IOException();//Line 4
}
}
Run Code Online (Sandbox Code Playgroud)
当我抛出两种类型的异常(Line4中的IOException和Line3中的RunTimeException)时,我发现我的程序在我在第1行和第2行的throws子句中指示"IOException"之前不会编译.
而如果我反向"抛出"以指示抛出IOException,则程序会成功编译,如下所示.
class Y {
public static void main(String[] args) throws IOException {//Line1
try {
doSomething();
}
catch (RuntimeException e) {
System.out.println(e);
}
}
static void doSomething() throws IOException {//Line 2
if (Math.random() > 0.5) throw …Run Code Online (Sandbox Code Playgroud) 这是不好的做法吗?
public String foo(File file) {
StringBuilder sb = new StringBuilder();
try(
BufferedInputStream bis =
new BufferedInputStream(
new FileInputStream(file))
) {
for(int c = bis.read(); c != -1; c = bis.read())
sb.append((char) c);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
假设没有办法从已检查的异常中优雅地恢复.
您是否经常在API文档(例如"公共函数的javadoc"中)中看到"值限制"的描述以及经典文档?
注意:我不是在谈论代码中的注释
"价值限制",我的意思是:
样品:
我经常看到的(无法访问源代码)是:
/**
* Get all readers name for this current Report. <br />
* <b>Warning</b>The Report must have been published first.
* @param aReaderNameRegexp filter in order to return only reader matching the regexp
* @return array of reader names
*/
String[] getReaderNames(final String aReaderNameRegexp);
Run Code Online (Sandbox Code Playgroud)
我希望看到的是:
/**
* Get all readers name for this current Report. <br />
* <b>Warning</b>The Report must have been published first.
* @param aReaderNameRegexp filter …Run Code Online (Sandbox Code Playgroud) setter方法有必要有一个参数吗?通常,setter方法接受一个参数作为Object的某个属性的值.如果我想首先测试依赖于另一个布尔值的参数的有效性,如果是,则首先验证,否则只需设置值.
我通过ftp服务器从客户端获取值.有时这些文件包含垃圾值.例如,#3432838#9等电话号码.所以在我设置值之前,我需要删除那些垃圾字符.我可以在setter方法中做到吗?这是一种有效的方法吗?
提前谢谢!
编辑:
这是有效的:
public void setSomething(String strValue){
if(checkValidity(strValue)){
// set the value
} else {
// set the value to an empty string
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
何时选择已检查和未检查的异常
为什么的Java作为一门语言有两种 checked和unchecked 异常.他们的目的是什么?
注意:我不是在问我何时应该使用它们,或者如何编写它们,而是它们添加到语言中的内容.
如果您想以相同的方式处理每个故障,例如通过记录它并跳到下一个请求,向用户显示消息并处理下一个事件等,如果这是我的用例,那么所有我都可以使用未经检查的异常.要做的是在我的系统中捕获一些高级别的常规异常类型,并以相同的方式处理所有内容.
但我希望从特定问题中恢复,而且我不确定使用未经检查的异常来处理它的最佳方法.这是一个具体的例子.
假设我有一个使用Struts2和Hibernate构建的Web应用程序.如果异常冒泡到我的"动作",我会记录它,并向用户显示一个非常道歉.但我的Web应用程序的一个功能是创建新的用户帐户,这需要一个唯一的用户名.如果用户选择已存在的名称,Hibernate会org.hibernate.exception.ConstraintViolationException在我的系统内容中抛出(未经检查的异常).我真的想通过要求用户选择另一个用户名来恢复这个特定问题,而不是给他们相同的"我们记录了你的问题,但现在你已经被软化了"的消息.
以下是需要考虑的几点:
IOException,而数据库实现会捕获SQLException,但两者都会抛出UserNotFoundException隐藏底层实现的内容.我如何利用未经检查的异常,免除每层的包装负担,而不泄漏实现细节?我试图将一个自定义throws子句添加到由接口定义的方法.这是不可能的.我怎么能绕过它呢?这是一些代码:
private void sendRequestToService(final ModuleRequest pushRequest)
{
ServiceConnection serviceConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName name, IBinder service)
{
try
{
//some lines..
} catch (RemoteException e)
{
throw new RuntimeException(new UnavailableDestException()) ;
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
知道如何抛出我的自定义异常吗?
据我所知,如果您只声明一个已检查的异常,它将通过您的所有方法传播到main方法,并仍然中断您的正常程序流程,您的程序仍将停止工作.那么,为什么不总是使用try/catch处理已检查的异常...这样你的程序不会因异常而停止?为什么要在方法的签名中声明异常?对不起,我的英语不好