抛出异常而无需在Java中使用try

时间:2016-11-13 02:16:55

标签: java exception

我希望能够运行这个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语句?

3 个答案:

答案 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");
}