2011-11-17 141 views
0

我非常肯定,这之前工作,但日食说,它在投掷线有错误。java抛出检查异常?

try{} 
}catch(Exception e){ 
    throw e; } 

在我的老学生项目中,我写道:

try { 
     Class.forName("org.postgresql.Driver"); 
     this.connection = DriverManager.getConnection(
       DataSource.getURL(), DataSource.getUserName(), DataSource.getPassword()); 
    } catch (ClassNotFoundException e) { 
     System.out.println("Could not find driver to connect to database. Please make" 
       + "sure the correseponding postgreSQLjdbc library is added."); 
     throw e; 

    } catch (SQLException e) { 
     System.out.println("Username or password is not correct"); 
     throw e; 
    } 

,它是完美的。

只有这种类型的作品,但它不是我想要的

throw new UnsupportedAddressTypeException(); 

回答

6

想必你的方法是声明UnsupportedAddressTypeException但不SQLExceptionClassNotFoundException。检查异常只能从声明抛出这些异常或超类的方法抛出(包括重新抛出现有的异常)。

+0

它总是这样吗?我会彻底疯狂... – Aubergine

+0

@Aubergine--它总是那样。一个方法声明检查它抛出/传播的异常的要求在1.0以后就已经在Java中,并且可能更早。你可能会发疯:-) –

+0

我明白这一点! :-)喝咖啡时间。 – Aubergine

0

蚀说,它的错误,因为:

其中包含的代码块需要具有一个声明所述的方法“抛出异常”

的方法,或者需要进行异常处理本身OR信号到其它调用方法它可以抛出一个异常,他们应该处理它。

处理它的替代方法是将“throw e”放在另一个try/catch块(处理异常本身的方法)中。

你的单码工作,因为它有这些语句的方法必须声明,如:

方法X()抛出ClassNotFoundException的,的SQLException

0

没有额外的信息与你在做什么具体的我只能给你的通用解决方案是重新引发包装在未经检查的RuntimeException中的异常。

您包含的代码会重新抛出异常,这是一个检查的异常。除非这个引入的方法被声明为“throws Exception”,否则这可能无法在任何Java版本中运行。

另一方面,不要记录和重新抛出。做一个或另一个。所以你的项目代码应该看起来像:

.... 

    } catch (SQLException e) { 
     throw RuntimeException("Username or password is not correct", e); 
    } 
0

ClassNotFoundException或SQLException是检查异常。因此,无论何时它们被抛出都应该被处理(即使手动使用'throw'关键字)。

有两种方法可以处理已检查的异常: 1.围绕可能在try-catch块内引发检查异常的代码。 2.在写入特定代码的方法定义之后添加throws子句。

现在,在这里,当您抛出e'其中e是ClassNotFoundException或SQLException的实例时,它必须以上述两种方式之一来处理。

但是,UnsupportedAddressTypeException是一个未经检查的异常。所以你不需要明确地处理它。你可以把它扔到任何地方,Java会照顾它。