Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java和android中的异常处理_Java_Android_Exception Handling - Fatal编程技术网

java和android中的异常处理

java和android中的异常处理,java,android,exception-handling,Java,Android,Exception Handling,我已经学会了java的基本知识。我想知道异常处理的相关知识 1) 可以用吗 try{............ }catch(Exception ex){ ........ } 而不是像这样更具体的东西 try{............ }catch(FileNotFoundException ex){ ........ } 这样,我不知道将抛出什么类型的异常 2) 如何确定代码的哪一部分位于try块中。如果我把整个代码放在“try”里面,然后转过脸来,那会是件坏事吗 3) 如果我必须具体说明

我已经学会了java的基本知识。我想知道异常处理的相关知识

1) 可以用吗

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”里面,你就不能具体说明 异常,甚至您的处理(应如何处理 例外情况)将受到限制
  • 正如我所说的,如果可以的话,最好选择更具体的方法,但如果您不确定,那么可以使用这种方法

    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”来检查它们