Java 避免嵌套的try/catch

Java 避免嵌套的try/catch,java,exception,exception-handling,nested,try-catch,Java,Exception,Exception Handling,Nested,Try Catch,如果str不是数字,parseInt将抛出NumberFormatException。但是我想“转换”它,这样我将有一个带有“message”的CustomException。我是否可以在不使用上述嵌套的try/catch块的情况下执行此操作?您可以将示例重构为 import java.util.Scanner; public class Test{ public static void main(String[] args){ Scanner input = new Sc

如果
str
不是数字,
parseInt
将抛出
NumberFormatException
。但是我想“转换”它,这样我将有一个带有“message”的
CustomException
。我是否可以在不使用上述嵌套的
try/catch
块的情况下执行此操作?

您可以将示例重构为

import java.util.Scanner;

public class Test{

    public static void main(String[] args){

    Scanner input = new Scanner(System.in);
    String str = input.next();
    int a;
    try{
        try{
            a = Integer.parseInt(str);
        }
        catch(NumberFormatException nfe){
            throw new CustomException("message");
        }
        if (a>50) throw new CustomException("message");
    }
    catch(CustomException e){
        //do something
    }
}
}
你可以写:

 try {
     a = Integer.parseInt(str);
     if (a > 50) {
         throw new CustomException("message");
     }
 } catch (NumberFormatException | CustomException e){
     //do something
 }

但是我建议您使用您的版本,因为代码更具可读性。即使删除了内部try,我的版本的可读性也不如你的版本。

使用
Scanner.hasNextInt()
解析int而不必担心异常


有关详细代码,请参阅。

这是您的确切用例吗?如果是这样,那么您不需要做什么,您只需捕获NumberFormatException即可。
如果(a>50)抛出新的CustomException(“消息”)
?您的意图是什么?闻起来像是一种味道。也许你可以用一个替换
CustomException
。在进一步操作之前,先看看“异常链接”。我写这篇文章时的答案都是胡说八道。@Turing85 err…也许是的…但我只是想知道我是否可以在catch块中重新引发异常,并在方法中处理重新引发的异常,而不必使用嵌套的try/catch块。您的第一个示例的行为方式与他的不同。当我调用System.out.println(e.getMessage())时,从catch内部抛出一个
CustomException
,而这个catch不会被捕获;在catch块内,NumberFormatException e将给出“For input string:~~”而不是“message”。@tarevirat在这两种情况下都有相同的消息吗?是的,我需要用一个方法处理所有抛出的异常,所以我需要在catch块中重新抛出一个CustomException。@tarevira您不必重新抛出exception,您可以在函数中包装所有内容,并在调用函数的共享块中处理异常
public static void main(String[] args){

    Scanner input = new Scanner(System.in);
    String str = input.next();
    int a;
    try{
        a = Integer.parseInt(str);
        if (a>50) throw new NumberFormatException("message");
    }
    catch(NumberFormatException e){
        //do something
    }
}