我有一个简单的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块吗?
答案 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)
答案 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)
其他选项:
在被调用的方法本身中捕获异常,打印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);
}
}