Java 如何调用在catch块中抛出异常的方法?
我正在尝试一个HandleException方法,它可以处理各种异常 问题是,我的函数返回一个值。但是如果我在catch块中使用HandleException,Java会抱怨函数不返回值,即使我的HandleException总是抛出异常 解决这个问题的好方法是什么?谢谢 下面是一个示例代码Java 如何调用在catch块中抛出异常的方法?,java,exception-handling,try-catch,throws,Java,Exception Handling,Try Catch,Throws,我正在尝试一个HandleException方法,它可以处理各种异常 问题是,我的函数返回一个值。但是如果我在catch块中使用HandleException,Java会抱怨函数不返回值,即使我的HandleException总是抛出异常 解决这个问题的好方法是什么?谢谢 下面是一个示例代码 public class MyException { static int foo(int num) throws Exception { try { re
public class MyException {
static int foo(int num) throws Exception {
try {
return bar(num);
} catch (Exception e) {
handleException();
// throw new Exception("Exception in foo", e);
}
}
static int bar(int num) throws IllegalArgumentException {
if (num < 0) {
throw new IllegalArgumentException("Num less than 0");
}
return num;
}
static void handleException(Exception e) throws Exception {
System.err.println("Handling Exception: " + e);
throw new Exception(e);
}
public static void main(String[] args) throws Exception {
int value = foo(-1);
}
}
我试图找到一种更干净的方法来编写catch块。这是因为handleException上抛出的异常已经被foo方法的catch块捕获。因此,foo方法不再抛出使catch块不返回任何内容的异常。因此,如果bar方法抛出异常,它将转到catch块,但由于catch块不返回任何内容,Java将执行catch块后面的行,但当它到达末尾时,它抛出一个错误,即该方法必须返回int类型的结果,因为您没有return语句 你应该改变这部分
public class MyException {
static int foo(int num) throws Exception {
try {
return bar(num);
} catch (Exception e) {
throw handleException(e); // this will throw the exception from the handleException
// throw new Exception("Exception in foo", e);
}
}
static int bar(int num) throws IllegalArgumentException {
if (num < 0) {
throw new IllegalArgumentException("Num less than 0");
}
return num;
}
// This method now returns an exception, instead of throwing an exception
static Exception handleException(Exception e) {
System.err.println("Handling Exception: " + e);
return new Exception(e);
}
public static void main(String[] args) throws Exception {
int value = foo(-1);
}
}
这是因为在handleException上引发的异常已经被foo方法的catch块捕获。因此,foo方法不再抛出使catch块不返回任何内容的异常。因此,如果bar方法抛出异常,它将转到catch块,但由于catch块不返回任何内容,Java将执行catch块后面的行,但当它到达末尾时,它抛出一个错误,即该方法必须返回int类型的结果,因为您没有return语句 你应该改变这部分
public class MyException {
static int foo(int num) throws Exception {
try {
return bar(num);
} catch (Exception e) {
throw handleException(e); // this will throw the exception from the handleException
// throw new Exception("Exception in foo", e);
}
}
static int bar(int num) throws IllegalArgumentException {
if (num < 0) {
throw new IllegalArgumentException("Num less than 0");
}
return num;
}
// This method now returns an exception, instead of throwing an exception
static Exception handleException(Exception e) {
System.err.println("Handling Exception: " + e);
return new Exception(e);
}
public static void main(String[] args) throws Exception {
int value = foo(-1);
}
}
foo方法的返回类型是int,handleException的返回类型是void,这就是编译器给出错误的原因
1在这里,您可以通过以下方式解决此问题:
再次按原样抛出异常
try{
return bar(num);
}
catch(Exception e){
handleException(e);
throw e;
}
2此外,如果您想抛出新创建的异常,则将handleException的返回类型更改为exception。使用
foo方法的返回类型是int,handleException的返回类型是void,这就是编译器给出错误的原因
1在这里,您可以通过以下方式解决此问题:
再次按原样抛出异常
try{
return bar(num);
}
catch(Exception e){
handleException(e);
throw e;
}
2此外,如果您想抛出新创建的异常,则将handleException的返回类型更改为exception。使用
在我最初的类中,我有很多方法都采用这种格式。。。我
我正试图想出一种更简洁的方法来编写catch块
我认为问题更多的是理解应用程序中如何处理异常;总的来说,这是一个设计问题
考虑方法:int fooint num throws Exception
方法foo返回一个值,捕获一个异常/句柄,并抛出一个异常。考虑这些方面。
如果该方法正常运行且没有错误,则返回一个值。否则,如果它的逻辑有问题,则在方法中抛出异常,捕获它并在方法的catch块中处理它。该方法还抛出一个异常
这里有两种选择需要考虑:
重新抛出一个异常,就像自定义业务/应用程序异常一样,只需记录它并重新抛出相同的异常或自定义异常,这些异常需要在其他地方处理—即在堆栈上的调用方法中。
处理异常:这意味着该方法处理异常。某些业务/应用程序逻辑发生在异常处理中。并且,该方法返回一个值。
抛出异常的方法的目的是在其他地方处理它,比如在调用方法中。处理可能类似于从异常问题中恢复、显示消息、中止事务或业务逻辑定义的任何内容
引发异常是否是因为业务逻辑问题?如果是这样的话,您很可能会向用户显示一条消息,或者对其执行一些其他逻辑操作,并/或采取进一步的步骤从中恢复—只要业务规则允许
如果由于应用程序逻辑无法恢复的情况而引发异常,请执行适当的操作
最终,您必须明确要求抛出异常的原因、如何处理抛出的异常以及如何在应用程序中处理它们。应用程序/逻辑/规则需求影响代码中异常处理的设计
注释编辑添加:
有相当多的文章解释了异常处理
网上的商业应用程序。你可以试试搜索
类似字符串的Java异常最佳实践。这里有一个这样的例子
包含一些有用信息的文章:。
最后还尝试用java 7引入各种新的构造来考虑。
在我最初的类中,我有很多方法都采用这种格式。。。我
我正试图想出一种更简洁的方法来编写catch块
我认为问题更多的是理解应用程序中如何处理异常;在通用电气公司,这是一个设计问题
内尔
考虑方法:int fooint num throws Exception
方法foo返回一个值,捕获一个异常/句柄,并抛出一个异常。考虑这些方面。
如果该方法正常运行且没有错误,则返回一个值。否则,如果它的逻辑有问题,则在方法中抛出异常,捕获它并在方法的catch块中处理它。该方法还抛出一个异常
这里有两种选择需要考虑:
重新抛出一个异常,就像自定义业务/应用程序异常一样,只需记录它并重新抛出相同的异常或自定义异常,这些异常需要在其他地方处理—即在堆栈上的调用方法中。
处理异常:这意味着该方法处理异常。某些业务/应用程序逻辑发生在异常处理中。并且,该方法返回一个值。
抛出异常的方法的目的是在其他地方处理它,比如在调用方法中。处理可能类似于从异常问题中恢复、显示消息、中止事务或业务逻辑定义的任何内容
引发异常是否是因为业务逻辑问题?如果是这样的话,您很可能会向用户显示一条消息,或者对其执行一些其他逻辑操作,并/或采取进一步的步骤从中恢复—只要业务规则允许
如果由于应用程序逻辑无法恢复的情况而引发异常,请执行适当的操作
最终,您必须明确要求抛出异常的原因、如何处理抛出的异常以及如何在应用程序中处理它们。应用程序/逻辑/规则需求影响代码中异常处理的设计
注释编辑添加:
有相当多的文章解释了异常处理
网上的商业应用程序。你可以试试搜索
类似字符串的Java异常最佳实践。这里有一个这样的例子
包含一些有用信息的文章:。
最后还尝试用java 7引入各种新的构造来考虑。
我不明白你的问题。。。在另一个方法中抛出异常并捕获它,您的代码MyException.java无法编译。下面是Oracle Java教程中关于异常及其处理的一些有用说明。。然后在catch块中返回它。正如我提到的,这只是一个示例代码,我写它是为了解释我试图解决的更大的问题。我不理解你的问题。。。在另一个方法中抛出异常并捕获它,您的代码MyException.java无法编译。下面是Oracle Java教程中关于异常及其处理的一些有用说明。。然后在catch块中返回它。正如我提到的,这只是一个示例代码,我编写它是为了解释我试图解决的更大的问题。