抛出java异常并停止

时间:2017-08-28 09:47:42

标签: java exception java-8

我有一个简单的Java程序,其中包含main方法和其他几种方法。每种方法都可能失败,但有不同的例外。

我现在正在做的是为每个方法添加try - catch块,但问题是如果第一个方法失败并且我捕获并打印异常,程序就会继续。< / p>

如果发生任何异常,我希望程序停止。在Java中解决这个问题的推荐方法是什么?

我目前的代码如下:

public static void main(String[] args) {
    // Get File Path
    String filePath = null;
    try {
        filePath = getFilePath(args);
    } catch (FileNotFoundException e) {
        System.out.println("not found");
    }

    // Load File content
    AtomicReference<String> content = new AtomicReference<String>();
    try {
        content.set(readYamlFile(sourceFilePath));
    } catch (IOException e) {
        System.out.println("Not able to load file");
    }


    try {
        jsonStr = convert(content.toString());
    } catch (IOException e) {
        System.out.println("Conversion failed ");
        e.printStackTrace();
    }
}

每个方法都有不同的异常类型。我应该使用一些通用异常并使用适当的消息抛出它,而不是使用try catch块吗?

5 个答案:

答案 0 :(得分:3)

使用特定异常的最后一个解决方案会更具可读性,但可能导致很多Exception子类。

以下是快速代码更新:

public static void main(String[] args) {
    try {
        String filePath = getFilePath(args);
        AtomicReference<String> content = new AtomicReference<String>();
        content.set(readYamlFile(sourceFilePath));
        jsonStr = convert(content.toString());
    }  catch (FileNotFoundException e) {
        System.out.println("not found");
    } catch (ReadYamlFileException e) {
        System.out.println("Not able to load file");
    } catch (ConvertJsonExceptione) {
        System.out.println("Conversion failed ");
    }
}

private String readYamlFile(String) throws ReadYamlFileException{ ... }
private String convert(String) throws ConvertJsonException{ ... }

由于我尝试在开头(过滤器参数)或方法结束(正确的方法执行)中有return语句,因此这种设计很有用。 如果没有,我们将有多行可以阻止进程,导致复杂的调试。

编辑:

当然,如果您只需要打印文本并停在那里(没有异常管理),您只需在每种方法中创建自己的例外:

private String readYamlFile(String) throws IOException {
    try{
       ...
    } catch (IOException e) {
        throw new IOException("Not able to load file", e);
    }
}

e是原始Exception抛出的

答案 1 :(得分:1)

  

如果发生异常,我想停止

您可以在return;块中添加System.exit(1)throw e;catch。每个都将停止执行。

取决于你想要什么,但你只能使用一个try块,然后是许多catch块。

答案 2 :(得分:1)

您可以通过以下方式停止代码执行

1停止当前线程并返回

Thread.currentThread().interrupt();
return;

2致电System.exit(1)

3只需将return放入void返回方法

4抛出异常throw e

答案 3 :(得分:1)

  1. 重构您的代码以使用try with resources
  2. try / catch块的数量取决于您的应用程序的设计。但是,如果你知道如何处理它并将其他方法抛给父方法,你应该处理子方法中的所有异常。

答案 4 :(得分:1)

您可以做的是在main方法中处理异常,该方法调用另一个方法。为捕获的不同异常创建多个catch,打印特定消息并再次从main中抛出捕获的异常。

public class Test {

public static void main(String args[]){

        System.out.println("Executing main method ");
    try{
        Test t = new Test();            //create an object
        t.method1();                    //call method 1
        t.method2();                    //call method 2
        t.method3();                    //call method 3

    }catch(NullPointerException npe){
        System.out.println("NullPointer Exception occured");
        throw npe;
    }catch(ArithmeticException ae){
        System.out.println("Arithmetic Exception occured");
        throw ae;
    }catch(ArrayIndexOutOfBoundsException aie){
        System.out.println("ArrayIndexOutOfBounds Exception  occured");
        throw aie;
    }catch(Exception e ){
        System.out.println("Some exception occured");
        throw e;
    }

 // will not be executed as exception is thrown above in catch block
        System.out.println("Exiting main method ");  

}



private void method1() {
        System.out.println("Executing method 1 ");

        String nullString = null;
        nullString.length();


}


private void method2(){
    System.out.println("Executing method 2 ");

    int i= 100/0;

}


private void method3(){

    System.out.println("Executing method 3 ");

    int[] myArray = new int[5];

    myArray[7]= 0;

    }


}

关键点1 :  如果在第一个方法中发生异常,则其余的方法/代码不会执行。

要点2 :  您仍然可以在main中处理异常并打印消息。

    *Output from above code:*

    Executing main method 
    Executing method 1 
    Exception in thread "main" java.lang.NullPointerException
    NullPointer Exception occured
        at Test.method1(Test.java:38)
        at Test.main(Test.java:9)

其他选项:

  1. 在被调用的方法本身中捕获异常,打印msg并使用System.exit(1)退出程序。

    private void method1() {
        System.out.println("Executing method 1 ");
    
    try{
        String nullString = null;
        nullString.length();
    }catch(Exception e){
        System.out.println("Null pointer exception in method 1");
        System.exit(1);
    }
    
    }