java和android中的异常处理
我已经学会了java的基本知识。我想知道异常处理的相关知识 1) 可以用吗java和android中的异常处理,java,android,exception-handling,Java,Android,Exception Handling,我已经学会了java的基本知识。我想知道异常处理的相关知识 1) 可以用吗 try{............ }catch(Exception ex){ ........ } 而不是像这样更具体的东西 try{............ }catch(FileNotFoundException ex){ ........ } 这样,我不知道将抛出什么类型的异常 2) 如何确定代码的哪一部分位于try块中。如果我把整个代码放在“try”里面,然后转过脸来,那会是件坏事吗 3) 如果我必须具体说明
try{............
}catch(Exception ex){
........
}
而不是像这样更具体的东西
try{............
}catch(FileNotFoundException ex){
........
}
这样,我不知道将抛出什么类型的异常
2) 如何确定代码的哪一部分位于try
块中。如果我把整个代码放在“try”里面,然后转过脸来,那会是件坏事吗
3) 如果我必须具体说明catch块,那么我如何知道可以抛出什么类型的异常呢?这是一个糟糕的变体。例如:
socket.send(data); // sending data via socket. This may cause IOException
但也可能存在另一个异常
,例如NullPointerException
。如果您将捕获所有异常,则更难发现错误:
Socket socket = null;
socket.send(data); // sending data via socket. This will cause NullPointerException
在本例中,您将看到一个NullPointerException
,但您会认为这是一个IOException
最好的变体是:
try {
Socket socket = null;
socket.send(data);
} catch(IOException ex) {
ex.printStackTrace();
} catch(NullPointerException ex) {
ex.printStackTrace();
}
// or in java 7 you can write catch(IOException | NullPointerException ex)
如果您希望捕获一些异常,或者如果不存在null
,则不编写第二个catch
块,您将发现所有错误,这将是不必要的
对不起,我的英语不好
try{............
}catch(FileNotFoundException ex){
........
}catch(Exception ex){
........
}
表示一般的抽取应该排在最后。Java有两种类型的异常 1检查异常 2未检查的异常 因此,您的问题是
如何确定try块中的代码部分。
Java强制您在try块中编写代码块,这可能会导致第一种类型的异常。
您可以编写e.printStackTrace()
了解导致异常的详细信息。答案是。。。。视情况而定
如果希望应用程序针对不同的异常类型表现不同,那么try
块应该很短,并且应该分别捕获异常
但是,如果您决定以通用方式处理代码故障,则可以在一个catch
块中捕获所有异常,例如,执行以下操作:
try {
// large block of code, throwing lots of exceptions
} catch (Throwable t) {
// This way you, and your admin will know what really happened.
logger.log(Level.SEVERE, "Error in my awesome block of code", t);
// This way you're hiding error details from your users
someGUI.showErrorMessage("Unexpected error during processing. Contact your local IT");
}
在现实生活中,这通常比这更复杂,您应该决定单独处理哪些错误,以及以单一、通用的方式处理哪些错误。1)使用try{..}catch(异常e){..}可以使代码更紧凑,并且能够在单个位置管理异常。
您还可以连接catch块以管理几种类型的异常:
try {
..
} catch(FileNotFoundException fe) {
//manage here this kind of exception
} catch(NullPointerException ne) {
//you missed a check on nulls! But the file has been found...
} catch(Exception e) {
//file has been found and no nulls are left...
}
请注意,块的顺序是相关的:在示例中,如果同时存在FileNotFoundException和NullPointerException,则会在FileNotFoundException捕获块中重定向
2) try-catch块显然会影响代码的性能,因此我认为您只需要放置以下代码:
-不在您的控制之下(例如,第三方库等)
-使用不可靠的介质(例如套接字连接、文件IO等)
-利用异常处理来表示特定行为(例如GoogleAppEngine超时异常等)不,这通常不好,因为您主要隐藏bug。我也阅读了下面的所有答案;但是关于第二个问题,我认为如果一个方法块的所有部分都需要在try/catch中,那么你应该让这个方法抛出(选中的)异常,并在调用者中捕获它。可能的重复正如我所知,捕获
抛出的
而不是异常
是个坏主意。一个是可丢弃的,但不能被捕获。在某些情况下,您应该捕获错误。类似于动态加载类时(NoClassDefFoundError
)。或者当您希望出现OOME,但又不希望应用程序中断时,等等。如何从NoClassDefFoundError中恢复?您会显示一条消息,表明用户试图加载的插件或库出现严重错误。如果这样做,您必须在catch
块中再次尝试该插件或库:throw t代码>如何知道代码将引发哪些异常?如何知道代码将引发哪些异常?有些异常不需要捕获。所有未处理的异常都会被捕获,因此您将在代码中看到错误。您只需要捕获要处理的异常。在我的示例中,如果出现异常,可以重新连接套接字。所有方法都提供有关它们可以抛出哪些异常的信息。请参阅javaDoc了解您正在使用的方法我没有收到您关于捕获顺序的说明;如果一个npex和一个fnfex都在一个try块中,你实际上被引导到第一个发生的(并且看不到第二个)你能解释一下对测试的影响吗performance@guido:如果你认为npex比fnfex更重要,你需要交换两个挡块…@JohnWatson:在封面下,编译后的代码需要检查每条指令是否存在异常。这取决于JVM是如何实现的,但通常速度会降低一个数量级,甚至更多less@JohnWatson:是的,我认为您应该将最小代码放入try-catch块中。通常我只捕获被调用方法的“抛出”列表中的异常。对于其他选项(例如NullPointerException),您应该能够在代码中使用简单的“if”来检查它们