我希望能够运行这个Java代码。如果它已经完全添加了超过4个字符串,它应该抛出一个异常,但是在调用addString方法的前4次使用try / catch时不应该这样做。
Foo myFoo = new Foo();
myFoo.addString("String A");
myFoo.addString("String B");
myFoo.addString("String C");
myFoo.addString("String D");
boolean exceptionThrown = false;
try {
myFoo.addString("String E");
} catch (NoRoomForMoreStringsException e) {
exceptionThrown = true;
}
assertTrue(exceptionThrown);
如果我在addString函数中添加这样的东西,它将要求我总是使用trow / catch语句。
public void addString(String str) throws NoRoomForMoreStringsException {
...
if(strings.size() >= 4) {
throw new NoRoomForMoreStringsException();
}
如何在addString方法中抛出异常而无需始终使用try / catch语句?
答案 0 :(得分:2)
您的NoRoomForMoreStringsException
可以是unchecked exception。我不是说这是一个好主意,但它会完成你的要求。
答案 1 :(得分:1)
如何在不需要的情况下在addString方法中抛出异常 总是使用try / catch语句?
您需要将NoRoomForMoreStringsException
声明为RuntimeException
,如下所示:
public NoRoomForMoreStringsException extends RuntimeException {
//methods for custom exception
}
在Java中,Exception
个对象有两种类型:
(1)已检查例外: 这些异常会强制您在方法签名中尝试/捕获或声明它们(如当前的NoRoomForMoreStringsException)。 最佳做法是,您需要非常小心地使用这些Checked异常,即,只有当您在捕获异常时需要执行恢复操作时才会这样做。
(2)未经检查/运行时异常:这些异常不会强制您捕获或声明异常。
大多数情况下,您可以更喜欢使用运行时异常(上面的类型2),因为通常情况下,我们在获得异常时可以做很少的事情(比如日志记录)。
因为Checked Exceptions非常嘈杂(意味着它们强制调用者捕获或声明方法签名),流行的框架(如Spring
)会尝试避免它们,即Spring
抛出运行时异常或甚至更好地将Checked Exceptions(如果有的话从JDK)包装/转换为Runtime Exceptions然后抛出。
所以,简而言之,如果你有一个恢复机制,你会选择Checked Exception(上面的Type1),否则你需要去RuntimeException(上面的Type2)
您可以参考here
答案 2 :(得分:-1)
如果你没有捕获它,编译器会抱怨,但它仍然可以编译并运行得很好。
object(App\Model\Entity\User) {
'username' => 'asdf',
'password' => '$2y$10$HHCtvYKGBCnMyTVj3WoRk.qQQdb50x/8NYuHbAaDgeCSprS5Lj0kG',
'email' => 'asdf@gmail.com',
'first_name' => 'asdf',
'last_name' => 'asdf',
'birth_date' => object(Cake\I18n\FrozenDate) {
'time' => '2000-01-01T00:00:00+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'profile_image' => 'testUrl',
'bio' => 'asdf',
'phone' => (int) 1234567890,
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'username' => true,
'password' => true,
'email' => true,
'first_name' => true,
'last_name' => true,
'birth_date' => true,
'profile_image' => true,
'bio' => true,
'phone' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [
'private' => [
'_required' => 'This field is required'
],
'admin' => [
'_required' => 'This field is required'
],
'joined_timestamp' => [
'_required' => 'This field is required'
],
'updated_timestamp' => [
'_required' => 'This field is required'
],
'active' => [
'_required' => 'This field is required'
],
'account_status' => [
'_required' => 'This field is required'
]
],
'[invalid]' => [],
'[repository]' => 'Users'
}
输出:
public static void main(String args[]){
System.out.println("Starting!");
Foo myFoo = new Foo();
myFoo.addString("String A");
myFoo.addString("String B");
myFoo.addString("String C");
myFoo.addString("String D");
myFoo.addString("String E");
}