Java 如何捕获抛出子句中列出的异常
如果我没有编写Java 如何捕获抛出子句中列出的异常,java,exception,Java,Exception,如果我没有编写try/catch子句,如何捕获在throws子句中声明的异常 当我写这样的函数时 public List<String> getTrackIds(int limit) throws NotConnectedException, UnauthorizedException { ... } public List getTrackId(int limit)引发NotConnectedException、UnauthorizedExc
try
/catch
子句,如何捕获在throws
子句中声明的异常
- 当我写这样的函数时
public List<String> getTrackIds(int limit) throws NotConnectedException, UnauthorizedException { ... }
public List getTrackId(int limit)引发NotConnectedException、UnauthorizedException{ ... }
- 。当我尝试调用此函数时,必须写入 try/catch block或在调用 功能。再说一次,如果我不写一个 试一试/接住拦网
- 使用
块来处理它们。(这是我的问题)try catch
- 在方法规范中使用
声明它们。(这不是我的问题,你来处理)抛出
异常
可以声明为抛出
整个程序流。即使是static void main(String[]args)
也可以用这些throws
子句声明,这最终意味着当抛出一个声明的异常时,应用程序将崩溃
让我们看看下面的例子:
/**
* Throws a MyException.
*/
public static void methodThrowsException() throws MyException {
throw new MyException();
}
/**
* Calls methodThrowsException(), and handles the thrown MyException
*/
public static void myMethod() {
try {
methodThrowsException();
} catch(MyException e) {
/* Do something */
}
}
/**
* Calls methodThrowsException, but does not handle the thrown MyException.
*/
public static void mySecondMethod() throws MyException {
methodThrowsException();
}
调用myMethod
或mySecondMethod
时,会发生以下情况:
public static void main(String[] args) {
myMethod(); /* No catching needed */
try {
mySecondMethod();
} catch(MyException e){
/* Catching needed */
}
}
如您所见,mySecondMethod
刚刚将捕获MyException
的问题转移到了它的调用者身上。有3种异常
语法错误:编译错误
逻辑错误:-运行时
运行时错误:运行时(最危险的错误)
这里1和2可以由程序员手动求解
然而,当出现运行时错误时,例如:-用户输入1/0,这是一个例外,此时1000行代码就付诸东流了
所以java开发人员想,他们将如何消除这类问题。
所以他们介绍了两件事:-
投掷
最后试着接球
因此,java中有两种类型的异常
选中(选中的异常始终需要一个处理程序)
未经检查
现在,让我们谈谈投掷是如何工作的:-
抛出永远不会捕获异常。它只是告诉jvm它包含异常,jvm应该忽略这个异常。
现在我知道您会想,如果代码中有异常,jvm将如何处理它。
jvm将在运行时抛出异常。您只能将抛出与选中的执行选项一起使用
而在try-catch中,try-block将查看是否存在可以捕获的异常,然后捕获该异常并运行进一步的代码。该方法的调用方必须计划使用自己的try-catch处理异常。假设您有methodA,methodB调用该异常,methodC调用该异常,依此类推
例1:
methodA抛出IOException
然后methodB必须要么扔掉它,要么抓住它,这样就结束了投掷。(假设它抛出了它)
所以methodC要么扔掉它,要么抓住它(再说一遍,假设它扔掉了它)
假设methodD实际上是主要的方法。再说一次,你要么扔,要么抓。如果你把它扔到这里,我们就在起点,没有地方可以扔,所以这将停止程序的执行。或者你可以抓住它
例2:
methodA抛出IOException
methodB必须再次抓住它或扔掉它。这一次,它抓住了它
methodC不再需要抛出或捕获它,因为它是在methodB中处理的。您可能应该检查此链接以了解何时应该处理异常(try catch)以及何时应该声明异常(with throws子句):
现在,回答你们的问题--
但是不需要在try/catch块中捕获它吗?
不总是这样。这取决于异常的类型。Java有两种类型的异常:Checked
和Unchecked
。而Error
是一种无法恢复的运行时情况,请在此处阅读更多有关它的信息
对于可能引发选中异常的代码,必须提供以下选项之一:
试挡
方法声明中的throws子句
对于可能引发未检查异常的代码,编译器不会强制您处理或声明它们。不过,如果你愿意,你可以做一个
在这种情况下如何捕获异常?
在您的情况下,NotConnectedException
和UnauthorizedException
都是未经检查的异常。因此,您可以(但不受编译器的强制)在方法代码中编写try-catch块,也可以在throws子句中声明它们。当您在throws子句中声明它们时,方法的调用方知道这些异常可能会从中抛出,并计划编写自己的try-catch,以便在其端进行异常处理
当我尝试调用此函数时,必须在调用函数中写入try/catch块或throws子句。
正如我提到的,这两个异常都是未选中的(从RuntimeException继承的),因此您不需要执行这两个操作。但你可以做其中一个
再说一遍,如果我不编写try/catch块,我将如何捕获这些异常?
你没有。方法的调用方必须计划使用自己的try-catch进行异常处理。try。。。catch(甚至最后:)块应该位于调用方方法
例如,调用方方法是:
public void handleTracks() {
int limit = 100;
try {
List<String> trackIds = getTrackIds(trackIds);
} catch (NotConnectedException ex) {
System.err.println("No connection was established to the tacks system. Please perform login").
} catch (UnauthorizedException ex) {
System.err.println("The user is unauthorized to handle the track").
}
}
这在方法引发多个异常的情况下很有用,对于2个或更多异常也很有用
} catch (UnauthorizedException | NotConnectedException ex) {
System.err.println("An error").
}
catch (Exception ex) {
System.err.println("An error").
}
public class ValidationException extends Exception {
public ValidationException(String msg){
super(msg);
}
}
public class Validator {
public void check(String sum) throws ValidationException{
checkForNull(sum);
checkForLetters(sum);
}
private void checkForNull(String sum) throws ValidationException{
if(sum==null || sum.equals("")){
throw new ValidationException("You must enter a sum");
}
}
private void checkForLetters(String sum) throws ValidationException {
if(.......){
throw new ValidationException("The sum cannot contain letters");
}
}
}
public void handle(){
String sum = view.getSumFromUser();
try{
validator.check(sum);
String answer = calculator.calculate(sum);
view.outputResponse("The answer is " + answer);
} catch (ValidationException ex){
view.outputResponse(ex.getMessage());
}
}